Как получить ошибки 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.ini, вы можете использовать .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.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 в .реврайт.
вы можете добавить следующую строку:
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_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.";
}
If, несмотря на все приведенные выше ответы (или вы не можете редактировать свой 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 {
...
}
как мы работаем PHP7, ответы здесь не исправить уже. Единственный, кто все еще в порядке, - это Фрэнк Форте, когда он говорит о PHP7. С другой стороны, вместо того, чтобы пытаться поймать ошибку с помощью try/catch, вы можете использовать трюк: используйте include. Здесь 3 части кода:
: tst1.в PHP<?php
error_reporting(E_ALL);
ini_set('display_errors','On');
// Missing " and ;
echo "Testing
?>
запуск этого в PHP7 ничего не покажет
а теперь попробуйте это:
: 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 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().