Я проверил свой ini-файл PHP (php.ini
), установлен ли display_errors
, а также отчет об ошибках E_ALL
. Я перезапустил свой веб-сервер Apache.
Я даже поместил эти строки в начало своего скрипта, и он даже не улавливает простые ошибки синтаксического анализа. Например, я объявляю переменные с помощью "$"
и не закрываю операторы ";"
. Но все мои скрипты показывают пустую страницу с этими ошибками, но я действительно хочу видеть ошибки в выводе моего браузера.
error_reporting(E_ALL);
ini_set('display_errors', 1);
Что осталось делать?
30 ответов
Это всегда работает для меня:
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
Однако это не заставляет PHP отображать ошибки синтаксического анализа - единственный способ показать эти ошибки - изменить ваш php.ini с помощью этой строки:
display_errors = on
(если у вас нет доступа к php.ini
, то включение этой строки в .htaccess
тоже может сработать):
php_flag display_errors 1
php_flag display_errors 1
для .htaccess
E_ALL
недостаточно для отображения всех ошибок в PHP 5.3. «E_STRICT
стал частью E_ALL
в версии 5.4.0» — Руководство по PHP В этой версии вам потребуется E_ALL | E_STRICT
или -1
.
Внутри вашего php.ini :
display_errors = on
Затем перезапустите свой веб-сервер.
sudo service apache2 restart
sudo apachectl -k restart
.
Loaded Configuration File
ini_get('display_errors')
, и он вернет пустую строку (что означает, что он отключен). И да, я проверил, чтобы убедиться, что это единственная строка в файле конфигурации. Настройка каким-то образом переопределяется, и я не могу понять, почему, и это сводит меня с ума. Да, я все перерыл в /etc/php.d/
, и это тоже не один из этих файлов. Да, я тоже перезапустил веб-сервер. Нет, в файле .htaccess
ничего нет. Я использую PHP 7.4.6.
Чтобы отобразить все ошибки, вам необходимо:
1. Добавьте эти строки в сценарий PHP, который вы вызываете из браузера (обычно index.php
):
error_reporting(E_ALL);
ini_set('display_errors', '1');
2. (а) Убедитесь, что в этом скрипте нет синтаксических ошибок .
—или—
2. (b) Установите display_errors = On
в свой php.ini
В противном случае он не сможет запустить даже эти 2 строки!
Вы можете проверить синтаксические ошибки в своем скрипте, выполнив (в командной строке):
php -l index.php
Если вы включаете сценарий из другого сценария PHP, он будет отображать синтаксические ошибки в включенном сценарии. Например:
index.php
error_reporting(E_ALL);
ini_set('display_errors', '1');
// Any syntax errors here will result in a blank screen in the browser
include 'my_script.php';
my_script.php
adjfkj // This syntax error will be displayed in the browser
Некоторые провайдеры веб-хостинга позволяют изменять параметры PHP в файле .htaccess
.
Вы можете добавить следующую строку:
php_value display_errors 1
У меня была та же проблема, что и у вас, и это решение устранило ее.
Вы можете обнаружить, что все настройки для «отчетов об ошибках» или «ошибок отображения» не работают в PHP 7. Это связано с изменением обработки ошибок. Попробуйте вместо этого:
try{
// Your code
}
catch(Error $e) {
$trace = $e->getTrace();
echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}
Или, чтобы поймать исключения и ошибки за один раз (это не обратно совместимо с PHP 5):
try{
// Your code
}
catch(Throwable $e) {
$trace = $e->getTrace();
echo $e->getMessage().' in '.$e->getFile().' on line '.$e->getLine().' called from '.$trace[0]['file'].' on line '.$trace[0]['line'];
}
try{} catch() {}
код повсюду в вашем уже определенном php-коде, я даже не хочу думать о беспорядке, который будет..
$bt = debug_backtrace(); print_r($bt);
.
Error
. Если вы переписываете все запросы (кроме, может быть, JavaScript, CSS, изображений и т. д.) в файл index.php, то держите там блок try catch, это упрощает задачу. Да, любая система, не имеющая единой точки входа, будет серьезной головной болью при обновлении.
Это будет работать:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>
Использование:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Это лучший способ записать его, но синтаксическая ошибка дает пустой результат, поэтому используйте консоль для проверки синтаксических ошибок. Лучший способ отладки PHP-кода - использовать консоль; выполните следующее:
php -l phpfilename.php
Установите это в своем файле index.php :
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Создайте файл с именем php.ini в папке, где находится ваш файл PHP.
Внутри php.ini добавьте следующий код (я показываю простую ошибку, показывающую код):
display_errors = on
display_startup_errors = on
Поскольку сейчас мы работаем с PHP 7, приведенные здесь ответы больше не верны. Единственный, который все еще в порядке, - это от Фрэнка Форте < / a>, поскольку он говорит о PHP 7.
С другой стороны, вместо того, чтобы пытаться отловить ошибки с помощью try / catch, вы можете использовать трюк: используйте include.
Вот три фрагмента кода:
Файл: tst1.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
// Missing " and ;
echo "Testing
?>
Запуск этого в PHP 7 ничего не покажет.
А теперь попробуйте это:
Файл: tst2.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
include ("tst3.php");
?>
Файл: tst3.php
<?php
// Missing " and ;
echo "Testing
?>
Теперь запустите tst2, который устанавливает отчет об ошибках, а затем включите tst3. Ты увидишь:
Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный конец файла, ожидаемая переменная (T_VARIABLE) или $ {(T_DOLLAR_OPEN_CURLY_BRACES) или {$ (T_CURLY_OPEN) в tst3.php в строке 4
Обычно я использую следующий код в моих простых проектах PHP.
if(!defined('ENVIRONMENT')){
define('ENVIRONMENT', 'DEVELOPMENT');
}
$base_url = null;
if (defined('ENVIRONMENT'))
{
switch (ENVIRONMENT)
{
case 'DEVELOPMENT':
$base_url = 'http://localhost/product/';
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL|E_STRICT);
break;
case 'PRODUCTION':
$base_url = 'Production URL'; /* https://google.com */
error_reporting(0);
/* Mechanism to log errors */
break;
default:
exit('The application environment is not set correctly.');
}
}
Если, несмотря на выполнение всех вышеперечисленных ответов (или вы не можете отредактировать файл php.ini), вы по-прежнему не можете получить сообщение об ошибке, попробуйте создать новый файл PHP, который позволяет создавать отчеты об ошибках, а затем включить файл проблемы. например:
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once('problem_file.php');
Несмотря на то, что в моем файле php.ini
все настроено правильно, это был единственный способ поймать ошибку пространства имен. Мой точный сценарий был:
//file1.php
namespace a\b;
class x {
...
}
//file2.php
namespace c\d;
use c\d\x; //Dies because it's not sure which 'x' class to use
class x {
...
}
Если вы каким-то образом оказались в ситуации, когда вы не можете изменить настройку с помощью php.ini
или .htaccess
, вам не повезло с отображением ошибок, когда ваши сценарии PHP содержат ошибки синтаксического анализа. Затем вам нужно будет решить линтинг файлов в командной строке следующим образом :
find . -name '*.php' -type f -print0 | xargs -0 -n1 -P8 php -l | grep -v "No syntax errors"
Если ваш хост настолько заблокирован, что не позволяет изменять значение с помощью php.ini
или .htaccess
, он также может запретить изменение значения с помощью ini_set
. Вы можете проверить это с помощью следующего PHP-скрипта:
<?php
if( !ini_set( 'display_errors', 1 ) ) {
echo "display_errors cannot be set.";
} else {
echo "changing display_errors via script is possible.";
}
find . -name '*.php' -type f -exec php -l {} \; | grep -v 'No syntax errors detected'
проще
Вы можете сделать что-то вроде ниже:
Задайте следующие параметры в вашем основном индексном файле:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
Затем, исходя из ваших требований, вы можете выбрать, что вы хотите показать:
Для всех ошибок, предупреждений и уведомлений:
error_reporting(E_ALL); OR error_reporting(-1);
Для всех ошибок:
error_reporting(E_ERROR);
Для всех предупреждений:
error_reporting(E_WARNING);
Для всех уведомлений:
error_reporting(E_NOTICE);
Дополнительную информацию см. здесь.
index.html
?
Вы можете добавить свой собственный обработчик ошибок, который может предоставить дополнительную отладочную информацию. Кроме того, вы можете настроить его для отправки вам информации по электронной почте.
function ERR_HANDLER($errno, $errstr, $errfile, $errline){
$msg = "<b>Something bad happened.</b> [$errno] $errstr <br><br>
<b>File:</b> $errfile <br>
<b>Line:</b> $errline <br>
<pre>".json_encode(debug_backtrace(), JSON_PRETTY_PRINT)."</pre> <br>";
echo $msg;
return false;
}
function EXC_HANDLER($exception){
ERR_HANDLER(0, $exception->getMessage(), $exception->getFile(), $exception->getLine());
}
function shutDownFunction() {
$error = error_get_last();
if ($error["type"] == 1) {
ERR_HANDLER($error["type"], $error["message"], $error["file"], $error["line"]);
}
}
set_error_handler ("ERR_HANDLER", E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
register_shutdown_function("shutdownFunction");
set_exception_handler("EXC_HANDLER");
Ответ принят, включая дополнительные параметры. В файлах PHP для моего виртуального хоста РАЗРАБОТКИ apache (.htaccess, если вы можете гарантировать, что он не попадет в производство):
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
Однако это не заставляет PHP отображать ошибки синтаксического анализа - единственный способ показать эти ошибки - изменить ваш php.ini с помощью этой строки:
display_errors = on
(если у вас нет доступа к php.ini
, то включение этой строки в .htaccess
тоже может сработать):
// I've added some extra options that set E_ALL as per https://www.php.net/manual/en/errorfunc.configuration.php.
php_flag log_errors on
php_flag display_errors on
php_flag display_startup_errors on
php_value error_reporting 2147483647
php_value error_log /var/www/mywebsite.ext/logs/php.error.log
Этот код сверху должен работать:
error_reporting(E_ALL);
Однако попробуйте отредактировать код на телефоне в файле:
error_reporting =on
Лучшее / простое / быстрое решение, которое вы можете использовать, если это быстрая отладка, - это окружить ваш код перехватывающими исключениями. Это то, что я делаю, когда хочу что-то быстро проверить в продакшене.
try {
// Page code
}
catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
catch (Throwable $e)
... Или другой блок catch под catch(Error $e)
<?php
// Turn off error reporting
error_reporting(0);
// Report runtime errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Report all errors
error_reporting(E_ALL);
// Same as error_reporting(E_ALL);
ini_set("error_reporting", E_ALL);
// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
?>
Пока ваш сайт работает, для файла php.ini
необходимо отключить display_errors из соображений безопасности. Однако для среды разработки display_errors можно включить для устранения неполадок.
Вы можете сделать это, изменив файл php.ini и добавив следующие
display_errors = on
display_startup_errors = on
ИЛИ вы также можете использовать следующий код, так как это всегда работает для меня
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Если у вас установлен Xdebug, вы можете изменить все настройки, установив:
xdebug.force_display_errors = 1;
xdebug.force_error_reporting = -1;
force_display_errors
Тип: int, Значение по умолчанию: 0, Представлено в Xdebug> = 2.3. Если для этого параметра установлено значение 1, то всегда будут отображаться ошибки, независимо от того, какова настройка PHP display_errors.
force_error_reporting
Тип: int, Значение по умолчанию: 0, Представлено в Xdebug> = 2.3 Этот параметр представляет собой битовую маску, например error_reporting. Эта битовая маска будет логически объединена с битовой маской, представленной error_reporting, для определения того, какие ошибки должны отображаться. Этот параметр может быть выполнен только в php.ini и позволяет принудительно отображать определенные ошибки независимо от того, что приложение делает с ini_set ().
Возможно, вы захотите использовать этот код:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Сообщать обо всех ошибках, кроме E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
Показать все ошибки PHP
error_reporting(E_ALL); or ini_set('error_reporting', E_ALL);
Отключить все отчеты об ошибках
error_reporting(0);
Если он указан в командной строке, вы можете запустить php
с -ddisplay_errors=1
, чтобы переопределить настройку в php.ini
:
php -ddisplay_errors=1 script.php
error_reporting(1);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
Поместите это вверху вашей страницы.
Введите это в верхней части кода
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
И в файле php.ini вставьте это:
display_errors = on
Это должно сработать.
Вы можете показать ошибку Php на экране простыми способами. Во-первых, просто поместите приведенный ниже код в свой файл php.ini.
display_errors = on;
(если у вас нет доступа к php.ini, то можно добавить эту строку в .htaccess):
php_flag display_errors 1
ИЛИ вы также можете использовать следующий код в своем файле index.php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
В CLI Unix очень удобно перенаправить только ошибки в файле:
./script 2> errors.log
В вашем скрипте либо используйте var_dump()
, либо эквивалентное, как обычно (оба STDOUT и STDERR получат вывод), но для записи только в файл журнала :
fwrite(STDERR, "Debug infos\n"); // Write in errors.log^
Затем из другой оболочки для живых изменений:
tail -f errors.log
Или просто
watch cat errors.log
./script
– это скрипт php CLI (hashbang #!/usr/bin/php
). Таким образом вы можете перенаправить ошибки php в файл. Это unix-конвейер. Это не php как CGI.
Просто пиши:
error_reporting(-1);
Вы не можете поймать ошибки синтаксического анализа при включении вывода ошибок во время выполнения, потому что он анализирует файл перед фактическим выполнением чего-либо (и, поскольку он обнаруживает ошибку во время этого, он ничего не выполняет). Вам нужно будет изменить фактическую конфигурацию сервера, чтобы display_errors был включен и использовался соответствующий уровень error_reporting. Если у вас нет доступа к php.ini, вы можете использовать .htaccess или аналогичный, в зависимости от сервера.
Этот вопрос может предоставить дополнительную информацию.
Похожие вопросы
Связанные вопросы
Новые вопросы
php
PHP — это широко используемый язык сценариев общего назначения с открытым исходным кодом, мультипарадигмальный, динамически типизированный и интерпретируемый, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.
$_REQUEST
), эти две строки будут работать большую часть времени .