Как запустить пользовательскую функцию / бит кода, когда PHP имеет ошибку разбора - PullRequest
1 голос
/ 24 марта 2009

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

(Для ясности, тип, который будет получен при запуске некорректного кода, выглядит так:

<?php
if () {
?>

)

Я посмотрел на настройку собственного обработчика ошибок, но ничего не получилось.

Ответы [ 3 ]

3 голосов
/ 24 марта 2009

Еще одна идея: если у вас есть собственный корневой сервер или вы просто хотите выполнить скрипт на локальном ПК, вы можете сделать следующее:

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

$path_to_test = 'failure.php';
$result = `php -l $path_to_test`;

Затем в $result появляются сообщения об ошибках разбора, поскольку флаг -l заставляет PHP только анализировать код. Это никогда не выполнит ничего. Вы можете самостоятельно проанализировать сообщения об ошибках, если они есть, и даже получить из них номера строк.

2 голосов
/ 24 марта 2009

Обычно вы бы использовали set_error_handler для этого, но в документах обратите внимание:

Следующие типы ошибок не могут быть обработаны пользовательской функцией: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING и большинство E_STRICT, возникающих в файле где set_error_handler() называется.

То, что у вас есть, есть PARSE_ERROR и не может быть отобранным этим. В разделах «комментарии пользователей» на странице set_error_handler есть множество решений, позволяющих отследить все ошибки, и некоторые говорят, что это работает, а некоторые говорят, что это не так, поэтому я предлагаю просто просмотреть их и найти, если таковые имеются на самом деле работа.

1 голос
/ 24 марта 2009

Это не Фатальная ошибка , поскольку этот термин используется в PHP. Это Ошибка разбора . Это означает, что PHP не может понять ваш код и, таким образом, он вообще никогда не приходит к выполнению кода. Поэтому вы не можете поймать такие ошибки. Если вы уверены, что код для тестирования не содержит каких-либо вредных инъекций, вы можете проверить его:

if ( !@eval( 'if () {' ) )
{

    echo "An error occured.";

}

Но обязательно прочитайте советы о том, как и когда использовать eval(). Это может быть довольно опасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...