使用 Guzzle 捕获 CUrl 超时异常
Posted
技术标签:
【中文标题】使用 Guzzle 捕获 CUrl 超时异常【英文标题】:Catch CUrl Timout Exceptions with Guzzle 【发布时间】:2020-10-23 23:39:48 【问题描述】:我正在尝试检索少数网站的 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 错误 28:无法连接到 acme.biz 端口 80:超时(请参阅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:SSL 证书”错误 mentioned here。我将 'verify' => false Guzzle 选项添加到 HTTP 客户端,该选项将其传递给 Guzze(就像我使用 Guzzle 时所做的那样),解决了这个问题,它可以通过更多域。 然后我得到错误: ConnectionException cURL 错误 28:无法连接到www.acme.biz 端口 80:超时 这是我在使用 Guzzle 时得到的结果
我假设必须有一种方法可以处理域列表并获取它们的 HTML,而不会出现异常终止进程?
【问题讨论】:
【参考方案1】:您正在使用 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;
【讨论】:
感谢您的建议,但似乎因为 HTTP 客户端只是一个 Guzzle 包装器,所以它有完全相同的问题。 你也可以看到这个help center (***.com/questions/29822686/…) 谢谢,如果我重新启用 SSL 验证,这可能会解决 SSL 证书,但我无法捕捉超时的问题是另一个问题。 您可以使用try catch($e)
方法保证响应
或者你可以使用这个set_time_limit(10000);
,但我建议不要使用它以上是关于使用 Guzzle 捕获 CUrl 超时异常的主要内容,如果未能解决你的问题,请参考以下文章