【发布时间】:2018-01-30 10:22:24
【问题描述】:
我想在我的错误处理程序中捕获 curl 错误和警告,这样它们就不会得到echoed 给用户。为了证明所有错误都已被捕获,我将$err_start 字符串添加到错误中。目前这里是我的代码的工作(但简化)sn-p(在浏览器中运行,而不是 cli):
<?php
set_error_handler('handle_errors');
test_curl();
function handle_errors($error_num, $error_str, $error_file, $error_line)
{
$err_start = 'caught error'; //to prove that the error has been properly caught
die("$err_start $error_num, $error_str, $error_file, $error_line<br>");
}
function test_curl()
{
$curl_multi_handle = curl_multi_init();
$curl_handle1 = curl_init('iamdooooooooooown.com');
curl_setopt($curl_handle1, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($curl_multi_handle, $curl_handle1);
$still_running = 1;
while($still_running > 0) $multi_errors = curl_multi_exec($curl_multi_handle, $still_running);
if($multi_errors != CURLM_OK) trigger_error("curl error [$multi_errors]: ".curl_error($curl_multi_handle), E_USER_ERROR);
if(strlen(curl_error($curl_handle1))) trigger_error("curl error: [".curl_error($curl_handle1)."]", E_USER_ERROR);
$curl_info = curl_getinfo($curl_handle1); //info for individual requests
$content = curl_multi_getcontent($curl_handle1);
curl_multi_remove_handle($curl_multi_handle, $curl_handle1);
curl_close($curl_handle1);
curl_multi_close($curl_multi_handle);
}
?>
请注意,我的完整代码有多个并行请求,但问题仍然表现为单个请求,如此处所示。另请注意,此代码 sn-p 中显示的错误处理程序非常基本 - 我的实际错误处理程序不会因警告或通知而死,因此无需在这方面对我进行培训。
现在,如果我尝试卷曲当前已关闭的主机,那么我成功捕获了卷曲错误并且我的脚本因以下原因而死:
caught error 256, curl error: [Couldn't resolve host 'iamdooooooooooown.com'], /var/www/proj/test_curl.php, 18
但是我的错误处理函数没有捕获到以下警告,并且正在被echoed 到页面:
Warning: (null)(): 3 is not a valid cURL handle resource in Unknown on line 0
我想在我的错误处理程序中捕获此警告,以便我可以记录它以供以后检查。
我注意到的一件事是,警告仅在 curl 代码位于函数内部时才会出现 - 当代码处于最高范围级别时不会发生。是否有可能在 test_curl() 函数的范围内无法访问 curl 全局变量之一(例如 CURLM_OK)?
我正在使用 PHP 版本 5.3.2-1ubuntu4.19
修改
- 更新了代码 sn-p 以充分展示错误
- 未捕获的警告仅在函数或类方法中出现
【问题讨论】:
-
你有启用
xdebug.scream设置的Xdebug吗? -
我不这么认为。这是否比
set_error_handler()捕获更多错误? -
看看this answer。它可能会有所帮助。
-
@Jack 感谢您的测试。我已经更新了代码 sn-p - 令我惊讶的是,只有当代码在函数或方法中时才会出现警告!
-
现在它只显示
caught error 256, curl error: [Couldn't resolve host 'iamdooooooooooown.com'], /home/xxx/curl.php, 18<br>,没有其他错误。
标签: php curl error-handling curl-multi