Как я могу поймать PHP фатальную ошибку

Вы можете использовать addcslashes перед подготовленным оператором. Я тестировал на mysql.

$value = addcslashes($value, '%');
$stmt = $db->prepare('select * from products where description like ?');
$stmt->execute(["$value%"]);
529
задан TRiG 30 March 2017 в 10:44
поделиться

4 ответа

Едва ли. Фатальные ошибки называют этим, потому что они являются фатальными. Вы не можете восстановиться от них.

4
ответ дан troelskn 30 March 2017 в 10:44
поделиться

PHP не обеспечивает стандартные средства для ловли и восстановления с фатальных ошибок. Это вызвано тем, что обработка не должна обычно восстанавливаться после фатальной ошибки. Сопоставление строк буфер вывода (как предложено исходным сообщением техника, описанная на PHP.net), определенно опрометчиво. Это просто ненадежно.

Вызов почты () функция из метода обработчика ошибок оказываются проблематичными, также. Если бы у Вас было много ошибок, Ваш почтовый сервер был бы загружен работой, и Вы могли оказаться с непростым ящиком входящих сообщений. Для предотвращения этого Вы могли бы полагать, что выполнение крона периодически просканировало журналы ошибок и отправило уведомления соответственно. Вы также хотели бы изучать программное обеспечение системного мониторинга, такой как Nagios.

<час>

Для разговора с битом о регистрации функции завершения работы:

Это верно, что можно зарегистрировать функцию завершения работы, и это - хороший ответ.

точка здесь - то, что мы обычно не должны пытаться восстановиться с фатальных ошибок, особенно не при помощи регулярного выражения против Вашего буфера вывода. Я отвечал принятый ответ , который связался с предложением на php.net, который был с тех пор изменен или удален.

, Что предложение должно было использовать regex против буфера вывода во время обработки исключений, и в случае фатальной ошибки (обнаруженный соответствием против любого настроенного текста ошибки Вы могли бы ожидать), попытайтесь сделать своего рода восстановление, или продолжал обрабатывать. Это не было бы методическими рекомендациями (я верю вот почему, что я не могу найти исходное предложение, также. Я или пропускаю его, или php сообщество подстрелило его).

могло бы стоить отметить, что более свежие версии PHP (приблизительно 5,1), кажется, вызывают функцию завершения работы ранее, прежде чем выходной обратный вызов буферизации будет вызван. В версии 5 и ранее, тот порядок был реверсом (выходной обратный вызов буферизации сопровождался функцией завершения работы). Кроме того, начиная с приблизительно 5.0.5 (который является намного ранее, чем версия 5.2.3 корреспондента), разгружены объекты задолго до того, как зарегистрированная функция завершения работы вызвана, таким образом, Вы не будете в состоянии полагаться на свои объекты в оперативной памяти сделать большую часть чего-либо.

Настолько регистрирующаяся функция завершения работы прекрасна, но вид задач, которые должны быть выполнены функцией завершения работы, вероятно, ограничен горсткой нежных процедур завершения работы.

ключевая еда на дом здесь является просто некоторыми словами мудрости для любого, кто натыкается на этот вопрос и видит совет в первоначально принятом ответе. Не делайте regex Ваш буфер вывода.

114
ответ дан Community 30 March 2017 в 10:44
поделиться

Журнал фатальных ошибок с использованием Register_Shutdown_function , который требует PHP 5.2 +:

register_shutdown_function( "fatal_handler" );

function fatal_handler() {
    $errfile = "unknown file";
    $errstr  = "shutdown";
    $errno   = E_CORE_ERROR;
    $errline = 0;

    $error = error_get_last();

    if( $error !== NULL) {
        $errno   = $error["type"];
        $errfile = $error["file"];
        $errline = $error["line"];
        $errstr  = $error["message"];

        error_mail(format_error( $errno, $errstr, $errfile, $errline));
    }
}

, вам придется определить error_mail и Функции format_error . Например:

function format_error( $errno, $errstr, $errfile, $errline ) {
    $trace = print_r( debug_backtrace( false ), true );

    $content = "
    <table>
        <thead><th>Item</th><th>Description</th></thead>
        <tbody>
            <tr>
                <th>Error</th>
                <td><pre>$errstr</pre></td>
            </tr>
            <tr>
                <th>Errno</th>
                <td><pre>$errno</pre></td>
            </tr>
            <tr>
                <th>File</th>
                <td>$errfile</td>
            </tr>
            <tr>
                <th>Line</th>
                <td>$errline</td>
            </tr>
            <tr>
                <th>Trace</th>
                <td><pre>$trace</pre></td>
            </tr>
        </tbody>
    </table>";
    return $content;
}

Использование SWIFT Mailer для записи функции функция error_mail .

См. Также:

622
ответ дан 22 November 2019 в 22:23
поделиться

Только что придумал это решение (PHP 5.2.0 +):

function shutDownFunction() { 
    $error = error_get_last();
    // fatal error, E_ERROR === 1
    if ($error['type'] === E_ERROR) { 
        //do your stuff     
    } 
}
register_shutdown_function('shutDownFunction');

Различные типы ошибок определены на http://www.php.net/manual/en/errorfunc .constants.php

142
ответ дан 22 November 2019 в 22:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: