[英]cURL function in while loop not working PHP
我希望 cURL 在 cURL 失敗時重試,但我有這樣的情況 我的 function 在 while 循環中不起作用。 但是當我刪除 while 循環時,它再次正常工作。
這是我的 function 片段:
function Curl($url){
$total_curl = 1;
$isRunning = true;
$sleep = 1;
while ($isRunning){
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_REFERER, $this->url ?? $url);
//for debug only!
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_TIMEOUT,10);
$resp = curl_exec($curl);
if((!$resp || curl_errno($curl))){
if($total_curl > 3){
$isRunning = false;
}
sleep($sleep);
}
curl_close($curl);
$total_curl++;
}
return $resp;
}
問題出在您的 while 循環中。 如果 curl 成功,您的 while 循環將永遠運行,因為$total_curl
變量永遠不會在嵌套的 if 中檢查。
我建議為此使用遞歸,因為我發現它更簡潔一些,這就是我處理它的方式:
/**
* Solve using recursion cause it's fun
*/
function Curl($url, $times_run = 0)
{
// Condition that will break recursion, in this case if curl failed and run 3 times
if ($times_run > 3) {
return;
}
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_REFERER, $url); // replace this with $this->url ?? $url if you want but i removed it since i am not inside a class
//for debug only!
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$resp = curl_exec($curl);
// Start recursive function if curl is not successful
if ((!$resp || curl_errno($curl))) {
Curl($url, $times_run++);
}
curl_close($curl);
return $resp;
}
另一種方法是保持你的方式,只在你的 while 循環的末尾添加一個return $resp
,如下所示:
function Curl($url)
{
$total_curl = 1;
$isRunning = true;
while ($isRunning) {
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_REFERER, $this->url ?? $url);
//for debug only!
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$resp = curl_exec($curl);
if ((!$resp || curl_errno($curl))) {
if ($total_curl > 3) {
$isRunning = false;
}
curl_close($curl);
$total_curl++;
} else {
curl_close($curl);
return $resp;
}
}
}
我希望這有助於解決你的問題,干杯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.