簡體   English   中英

用 Guzzle 捕獲 CUrl 超時異常

[英]Catch CUrl Timout Exceptions with Guzzle

我正在嘗試為少數網站檢索 HTML。 我使用的是 PHP file_get_contents,它工作得非常好,但速度很慢而且有點受限,所以我決定嘗試 Guzzle。 不幸的是,我發現即使使用記錄在案的異常處理,也很難阻止 Guzzle 拋出異常。 我的代碼很簡單:

    $websiteFQDN = 'http://acme.biz';

    $client = new \GuzzleHttp\Client(['http_errors' => false,'verify' => false, 'connect_timeout' => 121 ]);

    echo '<h3>'.$websiteFQDN.'</h3>';
    try {
        $res = $client->request('GET', $websiteFQDN);
        echo '<p>Appears Successful</p>';
    }
    catch (RequestException $e){
        echo '<p>Exception Caught</p>';
    }

我不斷收到以下錯誤:

GuzzleHttp\Exception\ConnectException cURL error 28: Failed to connect to acme.biz port 80: Timed out (see https://curl.haxx.se/libcurl/c/libcurl-errors.html )

關於為什么上面沒有捕捉到異常並允許進程繼續的任何建議? 在我的測試中,它遍歷了大約 20 個域而沒有問題,但后來我得到了上面的錯誤並殺死了它。

Laravel 7.0 | 狂飲7.0.1 | PHP 7.2.5

有人建議嘗試 Laravel HTTP 客戶端,但不幸的是它遇到了同樣的問題,因為它使用 Guzzle,而 Guzzle 又似乎使用 CUrl,我所做的只是添加抽象層。 我用這段代碼試了一下:

    $response = Http::withOptions(['verify' => false])->get($websiteFQDN);
    if($response->successful()){
        echo '<p>Appears Successful</p>';
    }else{
        echo '<p>Exception Caught</p>';
    }

當我嘗試使用 Laravel HTTP vanilla 時,我收到“ cURL 錯誤 60: ZEA52C36244 ”25F91C2DCE2 錯誤 60: ZEA52C362440253C5F91C2DCE2錯誤。 我將“驗證”=> false Guzzle 選項添加到 HTTP 客戶端,該客戶端將其傳遞給 Guzze(就像我使用 Guzzle 時所做的那樣),解決了這個問題,並且它通過了更多域。 然后我得到錯誤: ConnectionException cURL 錯誤 28:無法連接到www.acme.biz端口 80:超時這是我在使用 Guzzle 時得到的

我假設必須有一種方法可以處理域列表並獲取他們的 HTML 沒有例外地殺死進程?

您正在使用Laravel 7.x

您也可以使用Laravel提供的這個HTTP-CLIENT 它還在后面使用Guzzle

使用這個外觀:

use Illuminate\Support\Facades\Http;

你可以簡單地像這樣寫請求。

Http::get([URL]);

在您的情況下,您可以修改它。

Http::get('http://acme.biz');

如果您想要 json 響應,您也可以這樣做:

$response = Http::get('http://acme.biz')->json();
return $response;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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