[译]php和curl_multi_exec
本文是PHP and curl_multi_exec的翻譯
這篇文章闡述了如何從curl_multi句柄獲取數據。不久前,我將這段代碼片段貼到了一個更大的示例代碼中:
<?php$active = NULL;do {$ret = curl_multi_exec($multi, $active);} while ($ret == CURLM_CALL_MULTI_PERFORM);while ($active && $ret == CURLM_OK) {if (curl_multi_select($multi) != -1) {do {$mrc = curl_multi_exec($multi, $active);} while ($mrc == CURLM_CALL_MULTI_PERFORM);}} ?>我之前沒有真的去查過文檔試圖理解過它。所以這段代碼讓我感到困惑。現在我來解釋下它都做了什么。
首先,這里有兩個外層的循環。第一個負責清除curl緩存。第二個負責等待更多的數據,并且獲取到這些數據。這就是一個典型的阻塞I/O例子。我們阻塞住剩下程序的執行直到網絡I/O的結束。盡管這不是處理網絡I/O最合適的方法,但對于單進程、同步的PHP,這實際上是我們僅有的選擇。
讓我們先來看下第一層循環:
<?php$active = NULL;do {$ret = curl_multi_exec($multi, $active);} while ($ret == CURLM_CALL_MULTI_PERFORM); ?>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。
這時候我們就需要第二層循環:
<?phpwhile ($active && $ret == CURLM_OK) {if (curl_multi_select($multi) != -1) {do {$mrc = curl_multi_exec($multi, $active);} while ($mrc == CURLM_CALL_MULTI_PERFORM);}} ?>這層循環是說...
(while): 只要有活躍的連接,一切還看著都OK…(if) 如果網絡socket還有些數據…(do/while) 只要系統告訴我們要一直去獲取數據,我們就處理吧所以第二層循環負責檢查套接字直到一切就緒。
PHP手冊對這些東西的細節有稍微的介紹,但是libcurl C的文檔更加的完整。
總結
以上是生活随笔為你收集整理的[译]php和curl_multi_exec的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 48. Rotate Image
- 下一篇: Python 之协程