Is there any way to skip fatal error from include file in php?

旧街凉风 提交于 2020-01-03 09:10:14

问题


If I include a file in to php. If there is any fatal error in that php then is there any way to skip that .

<?php
   include "somefile.php";
   echo "OK"; // Is there any way to print this OK  If there is any fatal error on somefile.php
?>

I need to include this somefile.php file. It may return fatal error for some host. I want to skip this file for those host.

Please Advice me.


回答1:


With this, you can define your own continuation function that will take over in case of a fatal error. This uses register_shutdown_function() to intercept the fatal error.

Usage:

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();

If a fatal error occurs (like a parse error), script execution will continue from my_continuation_func(). Otherwise, include_catch() returns true if there was an error during parsing.

Any output (like echo 'something';) from the include() is treated as an error. Unless you enabled output by passing true as the third argument to include_try().

This code automatically takes care of possible working directory changes in the shutdown function.

You can use this for any number of includes, but the second fatal error that occurs cannot be intercepted: the execution will stop.

Functions to be included:

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]);
    }
}



回答2:


Fatal means fatal ... There is no way to recover from a fatal error.




回答3:


You can use 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();

But you can do it only once. Any further fatal error will stop execution.




回答4:


PHP won't tolerate with Fatal Errors. Best to check the included file and solve it. Actually, you can try looking at register-shutdown-function, but it's not recommended to run away from your problems.




回答5:


Yes, there is. It can be done through a simple if statement

You Have:

<?php
   include "somefile.php";
   echo "OK"; // Is there any way to print this OK  If there is any fatal error on
?>

Try This:

<?php
   if(include "somefile.php"){
          // echo do something if success
   }else{
          echo "OK";
   }



回答6:


edit: I missed the word fatal. As stated, you can't recover from a fatal error. If it is just an exception the hastly writen response below will work.

Including another php module is the same as that code being inserted inline, so a simple try-catch statement should work:

<?php
    try {
        include "somefile.php";
    } catch (Exception $e) {
        echo 'Caught exception: ',  $e->getMessage(), "\n";
    }
    echo "OK"; 
 ?>



回答7:


Try to set a set_error_handler() function that doesn't die on fatal errors, but instead Apache crashed. In other words, PHP needs to die so that the system doesn't.

See this LINK




回答8:


Fatal Error means there is something seriously wrong with the including code. As @Orangepill said there is no way to stop this fatal error message popping up. Please go through your coding and find the error.



来源:https://stackoverflow.com/questions/17160851/is-there-any-way-to-skip-fatal-error-from-include-file-in-php

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!