Устранение ошибки PHP Parser при использовании include

У меня есть файл под названием 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 » или очень близко к нему, поэтому вы можете просто пропустить требуемую часть.