在開發涉及多個HTTP 請求的PHP 程序時,尤其是進行大量API 請求時,使用cURL 是常見的選擇。為了提升效率,PHP 提供了一個多線程cURL 處理函數curl_multi_* ,可以並行地發送多個請求。這使得程序可以同時處理多個請求,而不是一個接一個地等待響應。
但是,當我們使用多線程cURL 時,我們不僅需要發送請求,還需要實時獲取每個請求的執行狀態、錯誤信息、返回的內容等數據。 curl_multi_info_read()函數便是幫助我們獲取這些信息的工具之一。
curl_multi_info_read()函數是PHP 中一個用於獲取多個並行cURL 請求執行狀態的函數。通過它,開發者可以在多個請求並行的情況下,實時監控每個請求的執行進度和狀態。該函數會返回一個包含當前請求狀態的數組,包括HTTP 狀態碼、請求是否成功等信息。
要使用curl_multi_info_read() ,你需要先通過curl_multi_init()初始化一個多線程cURL 會話,然後通過curl_multi_add_handle()將多個單獨的cURL 句柄添加到這個會話中。最後,你可以通過curl_multi_exec()讓請求並行執行,使用curl_multi_info_read()獲取每個請求的執行狀態。
以下是一個簡單的例子:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 初始化多線程 cURL 會話</span></span><span>
</span><span><span class="hljs-variable">$mh</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_init</span></span><span>();
</span><span><span class="hljs-comment">// 創建多個 cURL 句柄</span></span><span>
</span><span><span class="hljs-variable">$ch1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>(</span><span><span class="hljs-string">"https://www.example.com"</span></span><span>);
</span><span><span class="hljs-variable">$ch2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>(</span><span><span class="hljs-string">"https://www.example.org"</span></span><span>);
</span><span><span class="hljs-comment">// 設定 cURL 選項</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch1</span></span><span>, CURLOPT_RETURNTRANSFER, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch2</span></span><span>, CURLOPT_RETURNTRANSFER, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-comment">// 將 cURL 句柄添加到多线程會話中</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch1</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch2</span></span><span>);
</span><span><span class="hljs-comment">// 執行請求</span></span><span>
</span><span><span class="hljs-keyword">do</span></span><span> {
</span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_exec</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$active</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$active</span></span><span>) {
</span><span><span class="hljs-comment">// 等待請求完成</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_multi_select</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>);
}
} </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$active</span></span><span>);
</span><span><span class="hljs-comment">// 獲取每個請求的執行狀態</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_info_read</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>)) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'result'</span></span><span>] === CURLE_OK) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Request to "</span></span><span> . </span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'handle'</span></span><span>] . </span><span><span class="hljs-string">" succeeded.\n"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Request to "</span></span><span> . </span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'handle'</span></span><span>] . </span><span><span class="hljs-string">" failed with error: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">curl_error</span></span><span>(</span><span><span class="hljs-variable">$info</span></span><span>[</span><span><span class="hljs-string">'handle'</span></span><span>]) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
}
</span><span><span class="hljs-comment">// 清理</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_multi_remove_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch1</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_multi_remove_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch2</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_multi_close</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>curl_multi_info_read()會返回一個包含請求信息的數組,其中包括以下字段:
handle :對應的cURL 句柄。
result :執行結果。如果值為CURLE_OK ,表示請求成功。如果請求失敗,返回相應的錯誤代碼。
msg :返回的消息類型(通常為CURLMSG_DONE ,表示請求已完成)。
該函數會返回一個數組,如果沒有更多的請求信息,它將返回null 。
在進行多個並行請求時,程序的執行效率會大大提高,尤其是當請求之間沒有直接依賴關係時。利用curl_multi_info_read() ,我們可以實時地監控每個請求的狀態,確保在請求完成時能夠及時獲取到相關信息,處理異常或者獲取返回數據。
通過curl_multi_info_read() ,我們能夠:
獲取請求的執行狀態:確認請求是否成功。
捕獲請求的錯誤信息:如果請求失敗,可以即時獲取錯誤代碼,便於後續處理。
實時獲取請求的響應數據:如果請求成功,獲取返回的數據並進行處理。
在一些需要批量處理HTTP 請求的場景中, curl_multi_info_read()變得尤為重要。例如:
批量數據抓取:同時請求多個網站,獲取數據並解析。
並行API 調用:當多個外部API 需要被調用時,可以同時發起請求,獲取返回數據。
大規模並發請求:高效地發送並處理多個請求,避免阻塞。
curl_multi_info_read()在PHP 中提供了一個強大且實用的工具,用於獲取多個cURL 請求的執行狀態。通過合理地使用該函數,我們可以輕鬆監控並行請求的進展、捕獲錯誤信息以及獲取請求結果,極大提升多請求任務的執行效率。無論是在爬蟲開發、批量數據抓取,還是並行API 調用中, curl_multi_info_read()都是不可或缺的利器。
相關標籤:
cURL