CURLOPT_RETURNTRANSFER是cURL 庫中的一個選項,通常用於設置cURL 請求的返回方式。當這個選項被設置為true時,cURL 請求的返回結果不會直接輸出到瀏覽器或控制台,而是以字符串的形式返回。這樣,開發者就可以通過PHP 代碼捕獲並進一步處理返回的數據,而不是讓cURL 直接將內容顯示出來。
基本用法:
<span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLOPT_RETURNTRANSFER, </span><span><span class="hljs-literal">true</span></span><span>);
</span></span>
當你使用curl_multi_exec執行多個cURL 請求時,通常需要為每個請求設置特定的選項。這時,你可以通過curl_multi_setopt來設置每個cURL 會話的選項,包括CURLOPT_RETURNTRANSFER 。
<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">"http://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">"http://example.org"</span></span><span>);
</span><span><span class="hljs-comment">// 設置選項</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-variable">$mh</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_init</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-variable">$running</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-keyword">do</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">$running</span></span><span>);
} </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$running</span></span><span>);
</span><span><span class="hljs-comment">// 獲取結果</span></span><span>
</span><span><span class="hljs-variable">$response1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_getcontent</span></span><span>(</span><span><span class="hljs-variable">$ch1</span></span><span>);
</span><span><span class="hljs-variable">$response2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_getcontent</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">echo</span></span><span> </span><span><span class="hljs-variable">$response1</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$response2</span></span><span>;
</span><span><span class="hljs-comment">// 關閉 cURL 會話</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-title function_ invoke__">curl_close</span></span><span>(</span><span><span class="hljs-variable">$ch1</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_close</span></span><span>(</span><span><span class="hljs-variable">$ch2</span></span><span>);
</span></span>
在這個例子中,我們為每個cURL 會話設置了CURLOPT_RETURNTRANSFER為true ,使得每個請求的響應數據都作為字符串返回,而不是直接輸出到瀏覽器或控制台。這樣,你可以在處理多個請求時收集每個請求的響應內容。
CURLOPT_RETURNTRANSFER的作用是控制cURL 請求的輸出行為:
設置為true :返回的內容會作為字符串返回,開發者可以對返回的內容進行進一步的處理(如解析、存儲、輸出等)。這是絕大多數情況中的推薦設置,尤其是在執行多個請求時,你需要處理每個請求的結果。
設置為false : cURL 請求會直接將內容輸出到瀏覽器或控制台。此時你無法直接在代碼中捕獲響應結果,通常在一些簡單的GET 請求或下載文件時使用。
每個cURL 句柄都需要設置:在使用curl_multi_setopt處理多個請求時,每個單獨的cURL 句柄都需要設置CURLOPT_RETURNTRANSFER 。即使某些請求不需要返回內容,也要為其設置該選項。
響應內容的處理:在多線程請求中,通常你需要在所有請求執行完後通過curl_multi_getcontent()獲取每個請求的響應內容。確保在請求結束後對每個cURL 會話的返回結果進行處理。
調試:如果你發現多線程請求中的某些返回內容不符合預期,可以臨時將CURLOPT_RETURNTRANSFER設置為false ,觀察是否是cURL 配置問題引起的異常。
獲取多個API 的響應數據:通過curl_multi_setopt設置多個API 請求並並發執行,可以顯著提高效率。利用CURLOPT_RETURNTRANSFER捕獲每個請求的響應並進行進一步的處理。
批量下載文件:在批量下載文件時,你可以使用CURLOPT_RETURNTRANSFER將文件內容作為字符串或二進制流返回,避免直接輸出到瀏覽器,便於後續的保存操作。
爬蟲:對於需要並發抓取多個網頁的爬蟲程序, CURLOPT_RETURNTRANSFER是一個非常重要的配置,它幫助你捕獲每個請求的HTML 內容,進行解析和存儲。
正確地設置CURLOPT_RETURNTRANSFER參數對於多線程cURL 請求的順利進行至關重要。通過將此參數設置為true ,你可以有效地捕獲每個請求的響應內容,在程序中進一步處理或存儲。在使用curl_multi_setopt時,要確保為每個cURL 句柄正確地設置此選項,以便進行高效的數據處理。
在實際開發中,理解並靈活運用這些選項,可以讓你在處理並發請求時獲得更好的性能和控制力。