У меня есть файл под названием functions.php
.
Этот файл состоит из всех других файлов функций, например:
include_once("user_functions.php"); include_once("foo_functions.php");
Я хотел бы поймать ошибки, когда, когда я ввожу код в один из этих файлов, он не даст ошибку всей системе.
Например, если в foo_functions.php
есть ошибка foo_functions.php
она просто не будет включать его в functions.php
.
Это возможно?
Ошибки Parser являются фатальными ошибками, поэтому вы не можете их catch
. См. Этот вопрос и ответ для получения более подробной информации .
Что вы можете сделать, если вы можете запустить exec()
это вызвать php -l thefilename.php
и проверить результат. См. Руководство для получения информации о том, как это работает . Однако здесь есть несколько проблем:
exec()
часто отключается, как и должно быть, из-за чрезвычайно высоких рисков безопасности при неправильном использовании. Что, если вы положите
error_reporting(E_ALL); ini_set("display_errors", 1);
в начале foo_functions.php?
include()
и include_once()
возвращает false
если они терпят неудачу. Вы можете использовать это, чтобы проверить, успешно ли include
файлы d.
if (!include('user_functions.php')) echo 'user functions failed to include'; if (!include('foo_functions.php')) echo 'foo_functions failed to include';
Изменяя echo
сигналы для обработки логики ошибок, вы должны быть в состоянии делать то, что вы просите.
Решение, которое я использую, похоже на решение для групповой поддержки, но оно даст вам контроль.
Идея состоит в том, чтобы использовать «eval ()», чтобы сначала проверить наличие ошибок. Также игнорируйте ошибки с помощью @ в начале. Конечно, вам нужно быть осторожным с eval, поэтому никогда не позволяйте пользователям ничего питать.
// first "eval" the file to see if it contains errors $txt = file_get_contents($template_filename); // eval starts out in php-mode. get out of it. $txt = '?' . '>' . $txt; ob_start(); $evalResult = @eval($txt); ob_end_clean(); // if there are no errors if($evalResult !== FALSE) { require($template_filename); } else { error_log(print_r(error_get_last(), TRUE)); }
Обратите внимание, что я думаю, что « file_get_contents
+ eval
» = « require
» или очень близко к нему, поэтому вы можете просто пропустить требуемую часть.