7

如果我在 php.ini 中包含一个文件。如果该 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 文件。它可能会为某些主机返回致命错误。我想为那些主机跳过这个文件。

请给我建议。

4

8 回答 8

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]);
    }
}
于 2014-01-31T14:36:22.510 回答
2

致命意味着致命......没有办法从致命错误中恢复。

于 2013-06-18T05:03:24.717 回答
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();

但是你只能做一次。任何进一步的致命错误都将停止执行。

于 2013-06-18T05:14:27.387 回答
1

PHP 不会容忍致命错误。最好检查包含的文件并解决它。实际上,您可以尝试查看register-shutdown-function,但不建议逃避您的问题。

于 2013-06-18T05:10:06.640 回答
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";
   }
于 2014-08-10T17:19:50.027 回答
0

编辑:我错过了致命这个词。如前所述,您无法从致命错误中恢复。如果这只是一个例外,那么下面匆忙编写的响应将起作用。

包含另一个 php 模块与内联插入的代码相同,因此一个简单的try-catch语句应该可以工作:

<?php
    try {
        include "somefile.php";
    } catch (Exception $e) {
        echo 'Caught exception: ',  $e->getMessage(), "\n";
    }
    echo "OK"; 
 ?>
于 2013-06-18T05:03:26.930 回答
0

尝试设置一个set_error_handler () 函数,该函数不会因致命错误而死,而是 Apache 崩溃。换句话说,PHP 需要死掉,这样系统才不会死掉。

看到这个链接

于 2013-06-18T05:04:44.113 回答
0

致命错误意味着包含的代码存在严重错误。正如@Orangepill 所说,无法阻止弹出此致命错误消息。请检查您的编码并找出错误。

于 2013-06-18T05:10:22.190 回答