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