摘要:第一個負(fù)責(zé)清除緩存。我們阻塞住剩下程序的執(zhí)行直到網(wǎng)絡(luò)的結(jié)束。是之前調(diào)用方法產(chǎn)生的句柄,和都是整型的值。把設(shè)為正在處理的句柄個數(shù)。所有這些表明我們需要停止處理。手冊對這些東西的細(xì)節(jié)有稍微的介紹,但是的文檔更加的完整。
本文是PHP and curl_multi_exec的翻譯
這篇文章闡述了如何從curl_multi句柄獲取數(shù)據(jù)。不久前,我將這段代碼片段貼到了一個更大的示例代碼中:
我之前沒有真的去查過文檔試圖理解過它。所以這段代碼讓我感到困惑?,F(xiàn)在我來解釋下它都做了什么。
首先,這里有兩個外層的循環(huán)。第一個負(fù)責(zé)清除curl緩存。第二個負(fù)責(zé)等待更多的數(shù)據(jù),并且獲取到這些數(shù)據(jù)。這就是一個典型的阻塞I/O例子。我們阻塞住剩下程序的執(zhí)行直到網(wǎng)絡(luò)I/O的結(jié)束。盡管這不是處理網(wǎng)絡(luò)I/O最合適的方法,但對于單進程、同步的PHP,這實際上是我們僅有的選擇。
讓我們先來看下第一層循環(huán):
curl_multi_exec嘗試從multi句柄中獲取寫數(shù)據(jù)。$multi是之前調(diào)用curl_multi_init()方法產(chǎn)生的句柄,$active和$ret都是整型的值。
curl_multi_exec()把$active設(shè)為正在處理的句柄個數(shù)。換句話說,如果你正在用這個句柄請求5個URL,那么curl_multi_exec將返回5當(dāng)它正在處理所有的5個URL(應(yīng)該是指curl_multi_exec設(shè)$active為5),然后當(dāng)每個請求結(jié)束時,這個數(shù)字將會逐漸減少直到0。
$ret是如下值的一種:
CURLM_CALL_MULTI_PERFORM (-1):這意味著你需要再次調(diào)用curl_multi_exec(),因為仍有數(shù)據(jù)可供處理。
CURLM_OK(0):如文檔中所說:“都好了”。這意味著可能有更多的數(shù)據(jù),但還沒有到呢。
錯誤碼中的一個:CURLM_BAD_HANDLE ,CURLM_OUT_OF_MEMORY ,CURLM_INTERNAL_ERROR ,CURLM_BAD_SOCKET 。所有這些表明我們需要停止處理。
所以當(dāng)我們正在執(zhí)行第一層循環(huán),唯一需要我們繼續(xù)迭代的情況就是CURLM_CALL_MULTI_PERFORM。
現(xiàn)在,對于一些相當(dāng)小的情況,第一層循環(huán)就是你所需要的。然而通常的情況是,第一層循環(huán)會返回CURL_OK來表明還會有更多的數(shù)據(jù),但是這些數(shù)據(jù)還沒有在網(wǎng)絡(luò)上傳輸過來呢。
我們需要wait。
這時候我們就需要第二層循環(huán):
這層循環(huán)是說...
(while): 只要有活躍的連接,一切還看著都OK… (if) 如果網(wǎng)絡(luò)socket還有些數(shù)據(jù)… (do/while) 只要系統(tǒng)告訴我們要一直去獲取數(shù)據(jù),我們就處理吧
所以第二層循環(huán)負(fù)責(zé)檢查套接字直到一切就緒。
PHP手冊對這些東西的細(xì)節(jié)有稍微的介紹,但是libcurl C的文檔更加的完整。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/28376.html
摘要:普通請求創(chuàng)建多個資源并發(fā)創(chuàng)建多個資源創(chuàng)建批處理句柄增加句柄待優(yōu)化點在執(zhí)行而整個批處理句柄沒有全部執(zhí)行完畢時,系統(tǒng)會不停地執(zhí)行函數(shù)。進行改動的方式是應(yīng)用函數(shù)庫中的函數(shù),其函數(shù)原型如下阻塞直到批處理連接中有活動連接。 普通請求 curl_normal.php use time:0.830 s curl_multi并發(fā) curl_multi.php use time:0.259 s ...
摘要:不支持多線程模式和回調(diào)處理,因此內(nèi)部腳本都是同步阻塞式的,如果你發(fā)起一個的請求,那么程序就會阻塞,直到請求返回結(jié)果,才會繼續(xù)執(zhí)行代碼。參考資料手冊手冊預(yù)定義常量中實現(xiàn)多線程請求詳解每次使用同時并發(fā)多少請求合適簡書多線程及原理 后端服務(wù)開發(fā)中經(jīng)常會有并發(fā)請求的需求,比如你需要獲取10家供應(yīng)商的帶寬數(shù)據(jù)(每個都提供不同的url),然后返回一個整合后的數(shù)據(jù),你會怎么做呢? 在PHP中,最直觀...
摘要:說明這里用到的項目都是基于的項目。但同時,它和其他的分布式文件系統(tǒng)的區(qū)別也是很明顯的。能提供高吞吐量的數(shù)據(jù)訪問,非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用。放寬了一部分約束,來實現(xiàn)流式讀取文件系統(tǒng)數(shù)據(jù)的目的。是項目的一部分。 關(guān)鍵詞 Java、PHP、hdfs、mqrocket、excel、poi、報表 需求背景 在業(yè)務(wù)需求方面,每個企業(yè)或多或少都會有報表導(dǎo)出的作業(yè),量少則可是使用輸出流或者字符串的...
摘要:說明這里用到的項目都是基于的項目。但同時,它和其他的分布式文件系統(tǒng)的區(qū)別也是很明顯的。能提供高吞吐量的數(shù)據(jù)訪問,非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用。放寬了一部分約束,來實現(xiàn)流式讀取文件系統(tǒng)數(shù)據(jù)的目的。是項目的一部分。 關(guān)鍵詞 Java、PHP、hdfs、mqrocket、excel、poi、報表 需求背景 在業(yè)務(wù)需求方面,每個企業(yè)或多或少都會有報表導(dǎo)出的作業(yè),量少則可是使用輸出流或者字符串的...
摘要:根據(jù)獲取請求對象這個比較簡單可以看官方文檔將三個待請求對象放入下載器中輪詢一旦有一個請求完成,找出來,處理因為底層是,所以最大受限于從請求中獲取信息內(nèi)容錯誤把請求已經(jīng)完成了得刪除當(dāng)沒有數(shù)據(jù)的時候進行堵塞,把使用權(quán)交出來,避免上面死循環(huán)空跑數(shù) class CurlMultiUtil { /** * 根據(jù)url,postData獲取curl請求對象,這個比較簡單,可以看官方...
閱讀 25794·2021-09-29 09:41
閱讀 4913·2021-09-10 11:20
閱讀 1993·2021-09-09 09:32
閱讀 1947·2019-08-30 15:44
閱讀 3263·2019-08-29 17:13
閱讀 2864·2019-08-29 14:14
閱讀 2135·2019-08-29 14:11
閱讀 3276·2019-08-29 12:36