簡體   English   中英

cURL function 在 while 循環中不工作 PHP

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM