Php get require error

Как поймать ошибку require () или include () в PHP?

Я пишу скрипт в PHP5, который требует кода определенных файлов. Когда файл недоступен для включения, сначала выдается предупреждение и затем происходит фатальная ошибка. Я хотел бы напечатать собственное сообщение об ошибке, когда было невозможно включить код. Можно ли выполнить одну последнюю команду, если запрос не работает? следующее не сработало:

require('fileERROR.php5') or die("Unable to load configuration file."); 

Подавление всех сообщений об ошибках с использованием error_reporting(0) дает только белый экран, не используя error_reporting, дает PHP-ошибки, которые я не хочу показывать.

Вы можете выполнить это, используя set_error_handler в сочетании с ErrorException .

Пример страницы ErrorException :

 set_error_handler("exception_error_handler"); /* Trigger exception */ strpos(); ?> 

Когда вы будете обрабатывать ошибки как исключения, вы можете сделать что-то вроде:

Я просто использую ‘file_exists ()’:

if (file_exists("must_have.php")) < require "must_have.php"; >else

Лучшим подходом было бы сначала использовать путь realpath на пути. realpath вернет false если файл не существует.

$filename = realpath(getcwd() . "/fileERROR.php5"); $filename && return require($filename); trigger_error("Could not find file ", E_USER_ERROR); 

Вы даже можете создать свою собственную функцию require в пространстве имен вашего приложения, которое обертывает требуемую функцию PHP

namespace app; function require_safe($filename) < $path = realpath(getcwd() . $filename); $path && return require($path); trigger_error("Could not find file ", E_USER_ERROR); > 

Теперь вы можете использовать его в любом месте в ваших файлах

namespace app; require_safe("fileERROR.php5"); 

Я бы посоветовал вам взглянуть на последний комментарий в документации для функции set_error_handler () .

Он предлагает следующее как метод (и пример) улавливания фатальных ошибок:

 register_shutdown_function('shutdown'); ini_set('max_execution_time',1 ); sleep(3); ?> 

Я не пробовал это предложение, но это можно было бы использовать в других фатальных сценариях ошибок.

Читайте также:  Проверить наличие метода в классе php

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

Источник

Как отловить ошибку require () или include () в PHP?

Я пишу script в PHP5, для которого требуется код определенных файлов. Когда файл недоступен для включения, сначала выдается предупреждение, а затем фатальная ошибка. Я хотел бы напечатать собственное сообщение об ошибке, когда было невозможно включить код. Можно ли выполнить одну последнюю команду, если запрос не работает? следующее не получилось:

require('fileERROR.php5') or die("Unable to load configuration file."); 

Подавление всех сообщений об ошибках с помощью error_reporting(0) дает только белый экран, не используя error_reporting, дает PHP-ошибки, которые я не хочу показывать.

5 ответов

Вы можете выполнить это, используя set_error_handler в сочетании с ErrorException . Пример страницы ErrorException :

 set_error_handler("exception_error_handler"); /* Trigger exception */ strpos(); ?> 

Приведенный выше пример скопирован непосредственно из документации ErrorException (ссылка выше) — в «официальном» примере они используют $ errno как $ code, в то время как другие (в том числе в комментариях на этой странице) предложили использовать его как $ severity — обратите внимание, что если вам нравится, вы можете использовать его для обоих, или ни для одного.

Я просто использую ‘file_exists()’:

if (file_exists("must_have.php")) < require "must_have.php"; >else

Лучше использовать is_readable () ; он проверяет наличие файла, в дополнение к читаемости файла (просто, файл должен существовать, чтобы быть читаемым). Также, чтобы не включать каталоги, вы должны использовать is_dir () (то есть! Is_dir ($ filename)).

Лучшим подходом было бы использовать realpath на пути в первую очередь. realpath вернет false , если файл не существует.

$filename = realpath(getcwd() . "/fileERROR.php5"); $filename && return require($filename); trigger_error("Could not find file ", E_USER_ERROR); 

Вы даже можете создать свою собственную функцию require в своем приложении namespace, для которой требуется функция PHP

namespace app; function require_safe($filename) < $path = realpath(getcwd() . $filename); $path && return require($path); trigger_error("Could not find file ", E_USER_ERROR); > 

Теперь вы можете использовать его в любом месте в своих файлах

namespace app; require_safe("fileERROR.php5"); 

Я абсолютно не знаю, почему, но ваш код не работает правильно (выдает ложное срабатывание) при запуске в PHP CLI / console. Т.е. он останавливает выполнение скрипта, утверждая, что файл XYZ не существует, в то время как он действительно существует — комментирование вашего кода и прямой переход к include() работает нормально, и файл включается без ошибок.

Читайте также:  Заголовок страницы

Я бы посоветовал вам взглянуть на недавний комментарий в документации для set_error_handler().

Он предлагает следующее как метод (и пример) улавливания фатальных ошибок:

 register_shutdown_function('shutdown'); ini_set('max_execution_time',1 ); sleep(3); ?> 

Я не пробовал это предложение, но это можно было бы использовать в других фатальных сценариях ошибок.

Хотя это может сработать, но возникает хороший вопрос, будет ли это работать в условиях, которые задает ОП? Я полагаю, что большинство людей, приземляющихся здесь, ищут решение, где они могут поймать require на несуществующий файл и продолжить выполнение скрипта. Возможность изящно умереть (то есть отобразить что-то, я хочу, но в конечном итоге завершить работу скрипта — и именно это, похоже, и делает ваш код), кажется, не вписывается во многие сценарии. Я предполагаю, что скрипт может отображать все, что захочет, если умрет. Я хочу предотвратить смерть / завершение для несуществующего файла, который require по require .

Вам нужно использовать include(). Require() при использовании в несуществующем файле производит фатальную ошибку и выходит из script, поэтому ваш die() не будет выполняться. Include() только предупреждает, а затем продолжает script.

Ваш ответ относится либо к определенной версии PHP, либо к определенной конфигурации php.ini . С моей стороны (PHP 5.5.4) с моей конфигурацией изменение, require include не имеет абсолютно никакой разницы. Оба бросают ужасные фатальные ошибки, которые я не могу поймать.

Источник

Оцените статью