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