【发布时间】: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,而不会出现异常终止进程?
【问题讨论】: