我希望在我的错误处理程序中捕获curl的错误和警告,以便它们不会被echo
到用户。为了证明所有错误都已被捕获,我将$err_start
字符串添加到错误前面。目前这是我的代码片段(已经简化)(在浏览器中运行,而不是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);
}
?>
请注意,我的完整代码有多个并行请求,但是即使只有一个请求,问题仍会出现,如此处所示。请注意,此代码片段中显示的错误处理程序非常基本-我的实际错误处理程序不会在警告或通知上停止运行,因此无需对此进行指导。
现在,如果我尝试curl一个当前已关闭的主机,则成功捕获curl错误,并且我的脚本会停止并显示以下内容:
caught error 256, curl error: [Couldn't resolve host 'iamdooooooooooown.com'], /var/www/proj/test_curl.php, 18
然而,以下警告未被我的错误处理程序捕获,并已被“echo”到页面上:
Warning: (null)(): 3 is not a valid cURL handle resource in Unknown on line 0
我希望能够在我的错误处理程序中捕获这个警告,以便我可以记录下来后续检查。
我发现的一件事是:只有当curl代码在函数内部时,警告才会出现 - 当代码处于最高作用域级别时不会发生。是否可能一个curl全局变量(如)无法在函数范围内访问?
我正在使用PHP版本5.3.2-1ubuntu4.19。
编辑:
更新了代码片段以充分展示错误。
未捕获的警告仅在函数或类方法内部时发生。
xdebug.scream
设置的 Xdebug? - Álvaro Gonzálezset_error_handler()
捕获更多的错误? - mulllhausen