我正在运行一个脚本,该脚本需要一个未正确包含在我的脚本中的文件。
PHP Fatal error: require_once(): Failed opening required 'Math/BigInteger.php' (include_path='.:/usr/share/php:/usr/share/pear') in /myDir/Net/SSH2.php on line 746
我设置了error_handler
,记录了我得到的每一个错误:
function script_error_handler($errno, $errstr, $errfile, $errline){
echo "IN ERROR HANDLER\n";
$GLOBALS['errors'][] = array(
'errno' => $errno,
'errstr' => $errstr,
'errfile' => $errfile,
'errline' => $errline
);
return true;
}
我还有一个shutdown_function
,后来会通过错误来确定成功或失败(以及其他事项)。该功能的一部分打印出我记录的错误。
function shutdown_handler($io) {
print_r($GLOBALS['errors']);
echo "\n";
//irrelevant stuff ommitted
}
奇怪的是,这个输出如下:
Array
(
[0] => Array
(
[errno] => 2
[errstr] => require_once(Math/BigInteger.php): failed to open stream: No such file or directory
[errfile] => /myDir/Net/SSH2.php
[errline] => 746
)
)
根据PHP的Predefined Constants,2
是E_WARNING
的值。
2 | E_WARNING (integer) | Run-time warnings (non-fatal errors). Execution of the script is not halted.
这似乎与我之前获得的Fatal Error
输出明显冲突。为什么我在这种情况下得不到E_ERROR
?这是怎么回事?
答案 0 :(得分:4)
require
/ require_once
生成警告和致命错误。
如果没有自己的错误处理,你应该得到这样的东西:
警告:require_once(foo)[function.require-once]:无法打开流:[...]
中没有此类文件或目录致命错误:require_once()[function.require]:无法打开所需的'foo'(include_path ='。')[...]
查看输出的errstr
,您会看到“无法打开流:没有此类文件或目录”部分 - 因此警告的文本
而description of set_error_handler告诉你,
“使用用户定义的函数无法处理以下错误类型:E_ERROR,[...]”
因此警告按照预期被捕获 - 并且根据手册所说的,致命错误不是。