如果我在php中包含一个文件。如果那个php中有任何致命错误,那么就有办法跳过它。
<?php
include "somefile.php";
echo "OK"; // Is there any way to print this OK If there is any fatal error on somefile.php
?>
我需要包含这个somefile.php文件。它可能会返回致命错误 对于某些主持人我想跳过这个主机的文件。
请告诉我。
答案 0 :(得分:4)
有了这个,您可以定义自己的延续函数,以便在发生致命错误时接管。这使用register_shutdown_function()
来拦截致命错误。
用法:
function my_continuation_func($filename, $arg2) {
// On fatal error during include, continue script execution from here.
// When this function ends, or if another fatal error occurs,
// the execution will stop.
}
include_try('my_continuation_func', array($filename, $arg2));
$data = include($filename);
$error = include_catch();
如果发生致命错误(如解析错误),脚本执行将从my_continuation_func()
继续。否则,如果在解析过程中出错,include_catch()
将返回true
。
来自echo 'something';
的任何输出(如include()
)都被视为错误。除非您通过将true
作为第三个参数传递给include_try()
来启用输出。
此代码自动处理关闭功能中可能的工作目录更改。
您可以将此用于任意数量的包含,但发生的第二个致命错误无法被截获:执行将停止。
要包含的功能:
function include_try($cont_func, $cont_param_arr, $output = false) {
// Setup shutdown function:
static $run = 0;
if($run++ === 0) register_shutdown_function('include_shutdown_handler');
// If output is not allowed, capture it:
if(!$output) ob_start();
// Reset error_get_last():
@user_error('error_get_last mark');
// Enable shutdown handler and store parameters:
$params = array($cont_func, $cont_param_arr, $output, getcwd())
$GLOBALS['_include_shutdown_handler'] = $params;
}
function include_catch() {
$error_get_last = error_get_last();
$output = $GLOBALS['_include_shutdown_handler'][2];
// Disable shutdown handler:
$GLOBALS['_include_shutdown_handler'] = NULL;
// Check unauthorized outputs or if an error occured:
return ($output ? false : ob_get_clean() !== '')
|| $error_get_last['message'] !== 'error_get_last mark';
}
function include_shutdown_handler() {
$func = $GLOBALS['_include_shutdown_handler'];
if($func !== NULL) {
// Cleanup:
include_catch();
// Fix potentially wrong working directory:
chdir($func[3]);
// Call continuation function:
call_user_func_array($func[0], $func[1]);
}
}
答案 1 :(得分:2)
致命意味着致命...... 无法从致命错误中恢复。
答案 2 :(得分:2)
您可以使用register_shutdown_function。
<?php
function echoOk()
{
echo "OK";
}
register_shutdown_function(function ()
{
$error = error_get_last();
// to make sure that there is any fatal error
if (isset($error) &&
($error['type'] == E_ERROR
|| $error['type'] == E_PARSE
|| $error['type'] == E_COMPILE_ERROR
|| $error['type'] == E_CORE_ERROR))
{
echoOk();
}
});
include "somefile.php";
echoOk();
但你只能做一次。任何进一步的致命错误都将停止执行。
答案 3 :(得分:1)
PHP不会容忍致命错误。最好检查包含的文件并解决它。 实际上,您可以尝试查看register-shutdown-function,但不建议您远离问题。
答案 4 :(得分:1)
是的,有。它可以通过简单的if语句
来完成你有:
<?php
include "somefile.php";
echo "OK"; // Is there any way to print this OK If there is any fatal error on
?>
试试这个:
<?php
if(include "somefile.php"){
// echo do something if success
}else{
echo "OK";
}
答案 5 :(得分:0)
编辑:我错过了致命一词。如上所述,您无法从致命错误中恢复过来。如果只是一个例外,下面的书面回复将起作用。
包含另一个php模块与内联插入的代码相同,因此一个简单的try-catch
语句应该有效:
<?php
try {
include "somefile.php";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
echo "OK";
?>
答案 6 :(得分:0)
尝试设置 set_error_handler ()函数,该函数不会因致命错误而死亡,而是Apache崩溃。换句话说,PHP需要死掉,以便系统不会死。
请参阅此LINK
答案 7 :(得分:0)
致命错误意味着包含代码存在严重错误。正如@Orangepill所说,没有办法阻止这个致命的错误信息弹出。请仔细检查您的编码并找出错误。