PHP Curl連接超時(shí)解決方法
如果你經(jīng)常使用PHP Curl,你可能會(huì)遇到以下錯(cuò)誤信息:
curl_exec() timed out after 30 seconds
這意味著Curl連接超時(shí)了,因?yàn)樗枰ㄙM(fèi)更長時(shí)間來獲取消息。
解決Curl連接超時(shí)問題的策略如下:
1.設(shè)置Curl超時(shí)時(shí)間
你可以使用Curl選項(xiàng)CURLOPT_TIMEOUT和CURLOPT_CONNECTTIMEOUT來設(shè)置連接超時(shí)和請(qǐng)求超時(shí)時(shí)間。如果超過這個(gè)時(shí)間,Curl將返回一個(gè)錯(cuò)誤消息。
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://www.google.com/'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 10); //設(shè)置連接超時(shí)時(shí)間 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); //設(shè)置請(qǐng)求超時(shí)時(shí)間 $data = curl_exec($ch); if (curl_errno($ch)) { echo 'Error: ' . curl_error($ch); } curl_close($ch);
2.增加Curl緩沖區(qū)
當(dāng)php從Curl接收大量數(shù)據(jù)時(shí),它可能會(huì)超時(shí)。你可以增加Curl緩沖區(qū)的大小來解決這個(gè)問題。
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://www.google.com/'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_BUFFERSIZE, 4096); //設(shè)置緩沖區(qū)大小 $data = curl_exec($ch); if (curl_errno($ch)) { echo 'Error: ' . curl_error($ch); } curl_close($ch);
3.使用多線程
你可以使用多線程來加速Curl。這意味著你可以同時(shí)發(fā)送多個(gè)請(qǐng)求。
$mh = curl_multi_init(); //創(chuàng)建Curl句柄數(shù)組 $ch1 = curl_init(); curl_setopt($ch1, CURLOPT_URL, 'https://www.google.com/'); curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch1, CURLOPT_TIMEOUT, 10); curl_setopt($ch1, CURLOPT_CONNECTTIMEOUT, 5); curl_multi_add_handle($mh, $ch1); $ch2 = curl_init(); curl_setopt($ch2, CURLOPT_URL, 'https://www.baidu.com/'); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch2, CURLOPT_TIMEOUT, 10); curl_setopt($ch2, CURLOPT_CONNECTTIMEOUT, 5); curl_multi_add_handle($mh, $ch2); //執(zhí)行多線程請(qǐng)求 do { $status = curl_multi_exec($mh, $active); if ($active) { curl_multi_select($mh); } } while ($active && $status == CURLM_OK); //獲取結(jié)果 $res1 = curl_multi_getcontent($ch1); $res2 = curl_multi_getcontent($ch2); //關(guān)閉句柄和多線程句柄 curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh); echo $res1; echo $res2;
通過上述三種方法解決Curl連接超時(shí)問題。如果你還有其他方法可以分享,歡迎評(píng)論。