Как я могу получить PHP ошибки для отображения?
Я проверил мой PHP ini установлены ошибки файлов и отображения, а также сообщение об ошибке E_ALL. Я перезапустил свой веб-сервер Apache.
Я даже поставил эти строки в верхней части моего скрипта, и он даже не ловит простые ошибки разбора. Например, я объявляю переменные с "$" и я не закрываю заявления";". Но все мои скрипты показывают пустую страницу на этих ошибках, но я хочу на самом деле увидеть ошибки в моем браузере выход.
error_reporting(E_ALL);
ini_set('display_errors', 1);
что остается делать?
24 ответов:
это всегда работает для меня:
ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);однако это не делает PHP для отображения ошибок синтаксического анализа - единственный способ показать эти ошибки-это изменить ваш php.ini с этой строки:
display_errors = on
вы не можете поймать ошибки синтаксического анализа при включении вывода ошибок во время выполнения, потому что он анализирует файл перед фактическим выполнением чего-либо (и поскольку он сталкивается с ошибкой во время этого, он ничего не будет выполнять). Вам нужно будет изменить фактическую конфигурацию сервера, чтобы display_errors был включен и использовался уровень approriate error_reporting. Если у вас нет доступа к PHP.Ини, вы можете быть в состоянии использовать .htaccess или аналогичный, в зависимости от сервера.
этот вопрос может предоставить дополнительную информацию.
для отображения всех ошибок нужно:
1. Есть эти строки в PHP-скрипте, который вы вызываете из браузера (обычно
index.php):error_reporting(E_ALL); ini_set('display_errors', '1');2.(a) убедитесь, что в этом скрипте нет синтаксических ошибок
или
2.(b) Set
display_errors = Onв своемphp.iniв противном случае, он даже не может запустить эти 2 строки!
вы можете проверить на наличие синтаксических ошибок в вашем скрипте, запустив (в командной строке):
php -l index.phpесли вы включить скрипт из другого PHP скрипта тогда это будет отображение синтаксических ошибок в входит сценарий. Например:
index.phperror_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.phpadjfkj // 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']; }
использование:
ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);это лучший способ написать его, но синтаксическая ошибка дает пустой вывод, поэтому используйте консоль для проверки синтаксических ошибок. Лучший способ отладки PHP-кода - использовать консоль; выполните следующее:
php -l phpfilename.php
установите это в свой .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 скрипт:
<?php ini_set("display_startup_errors", 1); ini_set("display_errors", 1); /* Reports for either E_ERROR | E_WARNING | E_NOTICE | Any Error*/ error_reporting(E_ALL); echo(abc); /* Notice: abc is an undefined constant */ ?>для более подробного объяснения ошибок PHP, посетите PHP Error-error_reporting ().
при использовании PHP в качестве модуля Apache мы можем изменить параметры конфигурации с помощью директив в файлах конфигурации Apache (например, httpd.conf) и .htaccess файлы. Для этого вам понадобятся привилегии "AllowOverride Options" или "AllowOverride All".
проверить это
http://funbird.co.uk/blog/tech-articals/linux-tech-articals/enabling-error-display-php-via-htaccess
если вы каким-то образом окажетесь в ситуации, когда вы не можете изменить настройки через
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."; }
Если, несмотря на все вышеперечисленные ответы (или вы не можете редактировать свой php.ini file), вы все еще не можете получить сообщение об ошибке, попробуйте создать новый файл PHP, который позволяет создавать отчеты об ошибках, а затем включить файл проблемы. например:
error_reporting(E_ALL); ini_set('display_errors', 1); require_once('problem_file.php');несмотря на то, что все установлено правильно в моем
php.inifile, это был единственный способ, которым я мог поймать ошибку пространства имен. Мой точный сценарий был://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 { ... }
поскольку мы теперь запускаем PHP7, ответы, приведенные здесь, больше не являются правильными. Единственный, кто все еще в порядке, - это тот, от Фрэнка Форте, поскольку он говорит о PHP7. С другой стороны, вместо того, чтобы пытаться поймать ошибку с помощью try/catch, вы можете использовать трюк: использовать include. Вот 3 куска кода:
File: tst1.php
<?php error_reporting(E_ALL); ini_set('display_errors','On'); // Missing " and ; echo "Testing ?>запуск этого в PHP7 ничего не покажет
а теперь попробуйте это:
File: tst2.php
: tst3.php<?php error_reporting(E_ALL); ini_set('display_errors','On'); include ("tst3.php"); ?><?php // Missing " and ; echo "Testing ?>Теперь запустите tst2, который устанавливает отчет об ошибке, а затем включает tst3. Вы увидите:
ошибка синтаксического анализа: синтаксическая ошибка, неожиданный конец файла, ожидание переменной (T_VARIABLE) или ${ (T_DOLLAR_OPEN_CURLY_BRACES) или {$ (T_CURLY_OPEN) в tst3.php on line 4
вы можете сделать что-то вроде ниже :
установите ниже параметры в вашем основном индексном файле
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);для получения дополнительной информации проверьте здесь
Я обычно иду со следующим кодом в моем простом 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 = 'Prod url'; /* https://google.com */ error_reporting(0); /* Mechanism to log errors */ break; default: exit('The application environment is not set correctly.'); } }надеюсь, что это помогает.
вы можете добавить свой собственный обработчик ошибок, который может предоставить дополнительную отладочную информацию. Кроме того, вы можете настроить его, чтобы отправить вам по электронной почте.
function ERR_HANDLER($errno ,$errstr, $errfile, $errline){ $msg="<b>Someting 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");
лучшая/простое/быстрое решение, которое вы можете использовать, если это быстрая отладка, это окружить код с отловом исключений. Это то, что я делаю, когда хочу быстро проверить что-то на производстве.
try { //Page code } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; }Я надеюсь, что это помогает.
этот код сверху должен работать error_reporting(E_ALL);
однако попробуйте отредактировать код на телефоне в файле
error_reporting =on
<?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 можно включить для устранения неполадок.
если у вас установлен xdebug, вы можете переопределить все настройки, установив:
xdebug.force_display_errors = 1; xdebug.force_error_reporting = -1;force_display_errors
тип: int, значение по умолчанию: 0, введено в Xdebug >= 2.3 если это параметр имеет значение 1, то ошибки всегда будут отображаться, независимо от что установка на то, что display_errors в PHP есть.
force_error_reporting
тип: int, значение по умолчанию: 0, введено в Xdebug >= 2.3 Этот параметр является битовой маской, как предназначенных. Эта битовая маска будет логически связана с битовой маской, представленной error_reporting в dermine, какие ошибки должны отображаться. Эта настройка может быть выполнена только в php.ini и позволяет принудительно отображать определенные ошибки независимо от того, что приложение делает с ini_set().
Comments