Как я могу получить полезные сообщения об ошибках в PHP?

583

Довольно часто я пытаюсь запустить скрипт PHP и просто получить пустой экран обратно. Нет сообщения об ошибке; просто пустой экран. Причиной может быть простая синтаксическая ошибка (неправильная скобка, пропущенная точка с запятой), сбой вызова функции или что-то еще полностью.

Очень сложно понять, что пошло не так. Я заканчиваю тем, что комментирую код, везде вводю «эхо» и т. Д., Пытаясь сузить проблему. Но наверняка должен быть лучший путь, верно?

Есть ли способ заставить PHP выдавать полезное сообщение об ошибке, как это делает Java?

Чандидаса
источник
2
Также см stackoverflow.com/q/1475297/632951
Pacerier
4
@JuannStrauss, это занижает. И когда вы наконец видите ошибки, это говорит T_PAAMAYIM_NEKUDOTAYIM. Или, может быть, «должен быть экземпляром целого, данного целого» .
Pacerier
1
Учебник по этому: code2real.blogspot.com/2015/06/…
ученик

Ответы:

498

Для синтаксических ошибок необходимо включить отображение ошибок в php.ini. По умолчанию они отключены, потому что вы не хотите, чтобы «клиент» видел сообщения об ошибках. Проверьте эту страницу в документации PHP для информации о 2 директивах: error_reportingи display_errors. display_errorsвероятно, тот, который вы хотите изменить. Если вы не можете изменить php.ini, вы также можете добавить следующие строки в файл .htaccess:

php_flag  display_errors        on
php_value error_reporting       2039

Вы можете рассмотреть возможность использования значения E_ALL (как упомянуто Gumbo) для вашей версии PHP для error_reportingполучения всех ошибок. больше информации

3 других пункта: (1) Вы можете проверить файл журнала ошибок, так как в нем будут все ошибки (если регистрация не была отключена). (2) Добавление следующих 2 строк поможет вам отлаживать ошибки, которые не являются синтаксическими ошибками:

error_reporting(-1);
ini_set('display_errors', 'On');

(3) Другой вариант - использовать редактор, который проверяет ошибки при вводе , например, PhpEd . PhpEd также поставляется с отладчиком, который может предоставить более подробную информацию. (Отладчик PhpEd очень похож на xdebug и интегрируется непосредственно в редактор, поэтому вы используете одну программу для всего.)

Ссылка Картмана тоже очень хорошая: http://www.ibm.com/developerworks/library/os-debug/

Дэррил Хейн
источник
25
2039 это стоимость E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE. См. Docs.php.net/manual/en/errorfunc.constants.php
Gumbo
Мне нравится опция файла .htaccess. Это помогает мне отлаживать в области, которая не является частью общедоступного веб-сайта. Большое спасибо за этот совет!
jacekn
1
Я бы добавил, что регистрация ошибок в файле (и поиск их там) - лучшее решение. Не полагайтесь на отображение ошибок на странице - они могут испортить их, вы можете забыть включить отчеты об ошибках для производственного сайта, и это создаст вам проблемы в будущем
Иван Ярыч,
455

Следующее включает все ошибки:

ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
error_reporting(-1);

Также см. Следующие ссылки

Eljakim
источник
28
Лучше всего вносить эти изменения на уровне файла .ini. Включение отчетов об ошибках из скрипта бесполезно, так как это не поможет с ошибками синтаксиса или другими фатальными ошибками, которые убивают фазу компиляции. Сценарий уничтожается задолго до того, как он начинает выполняться и достигает переопределений отчетов.
Марк Б
Вы действительно правы. Я не заметил, что переезд на ваш собственный сервер.
Эляким
6
Запустите phpinfo (), чтобы найти правильный файл php.ini. Найдите строку « Загруженный файл конфигурации» .
ужасно
1
Если вы ищете ошибки, которые возникают на этапе компиляции, проверьте журналы apache, часто расположенные по адресу /var/log/apache2/error.log
csi
1
Этот ответ потерпит неудачу на php7, если включена строгая типизация, поскольку вторым параметром ini_setявляется строка.
PeeHaa
175

Следующий код должен отображать все ошибки:

<?php

// ----------------------------------------------------------------------------------------------------
// - Display Errors
// ----------------------------------------------------------------------------------------------------
ini_set('display_errors', 'On');
ini_set('html_errors', 0);

// ----------------------------------------------------------------------------------------------------
// - Error Reporting
// ----------------------------------------------------------------------------------------------------
error_reporting(-1);

// ----------------------------------------------------------------------------------------------------
// - Shutdown Handler
// ----------------------------------------------------------------------------------------------------
function ShutdownHandler()
{
    if(@is_array($error = @error_get_last()))
    {
        return(@call_user_func_array('ErrorHandler', $error));
    };

    return(TRUE);
};

register_shutdown_function('ShutdownHandler');

// ----------------------------------------------------------------------------------------------------
// - Error Handler
// ----------------------------------------------------------------------------------------------------
function ErrorHandler($type, $message, $file, $line)
{
    $_ERRORS = Array(
        0x0001 => 'E_ERROR',
        0x0002 => 'E_WARNING',
        0x0004 => 'E_PARSE',
        0x0008 => 'E_NOTICE',
        0x0010 => 'E_CORE_ERROR',
        0x0020 => 'E_CORE_WARNING',
        0x0040 => 'E_COMPILE_ERROR',
        0x0080 => 'E_COMPILE_WARNING',
        0x0100 => 'E_USER_ERROR',
        0x0200 => 'E_USER_WARNING',
        0x0400 => 'E_USER_NOTICE',
        0x0800 => 'E_STRICT',
        0x1000 => 'E_RECOVERABLE_ERROR',
        0x2000 => 'E_DEPRECATED',
        0x4000 => 'E_USER_DEPRECATED'
    );

    if(!@is_string($name = @array_search($type, @array_flip($_ERRORS))))
    {
        $name = 'E_UNKNOWN';
    };

    return(print(@sprintf("%s Error in file \xBB%s\xAB at line %d: %s\n", $name, @basename($file), $line, $message)));
};

$old_error_handler = set_error_handler("ErrorHandler");

// other php code

?>

Единственный способ создать пустую страницу с этим кодом - это когда у вас есть ошибка в обработчике завершения работы. Я скопировал и вставил это из моей собственной CMS без тестирования, но я уверен, что это работает.

m4dm4x1337
источник
4
Я получаю пустую страницу из этого кода. Что вы подразумеваете под «у вас есть ошибка в обработчике выключения» и что я должен сделать, чтобы решить проблему?
Paolo M
@PaoloM, он говорит об ошибке в функции ShutdownHandlerвыше. По сути, это временный взлом вместо правильной обработки ошибок.
Pacerier
Спасибо, было полезно, но как я могу отключить E_NOTICEошибки в этой функции?
MajAfy
Это правильное решение, но будьте осторожны с раскрытием информации при возникновении ошибки ... (предпочитайте ведение журнала, а не эхо для пользователей)
Сэм Джейсон Брэддок
1
Я использую это, когда Symfony не может правильно отловить фатальные ошибки.
Катушка
61

Ошибки и предупреждения обычно появляются в ваших настройках php.ini ....\logs\php_error.logили в ....\logs\apache_error.logзависимости от них.

Также полезные ошибки часто направлены в браузер, но, поскольку они не являются действительными html, они не отображаются.

Так что "tail -f«ваши файлы журнала и когда вы получаете пустой экран, используйте IE меню« вид »->« источник »меню для просмотра необработанных выводов.

Джеймс Андерсон
источник
13
К сожалению, просмотр исходной страницы тоже ничего не отображает.
Мэтью Шарли
2
Ошибки разбора должны быть видны в журнале ошибок Apache, независимо от того, какие настройки у вас есть где-либо еще. Если у вас нет контроля над сервером, получение журнала ошибок apache может быть затруднено, но я советую вам поговорить с вашим провайдером, и есть способы предоставить вам журнал ошибок. Кроме этого, я могу только предложить то, что есть у других - проверить ваш код на синтаксический анализ ошибок на вашем локальном сервере разработки перед развертыванием в рабочей среде. Кроме того, валидационная IDE, такая как Eclipse's PDT, может быть очень полезна.
Guss
5
Возвращаясь к этому, у меня недавно была проблема переполнения стека, которая не вызывала никаких ошибок, даже в журналах, и не проявлялась как таковая, пока я не установил xdebug на сервер. Гах.
Мэтью Шарли
Если вы не можете изменить php.ini, создайте в нем файл .htaccess php_flag display_errors 1.
Том
59

Вы можете включить следующие строки в файл, который вы хотите отладить:

error_reporting(E_ALL);
ini_set('display_errors', '1');

Это переопределяет настройки по умолчанию в php.ini, которые просто заставляют PHP сообщать об ошибках в журнал.

Томалак
источник
2
Это правда. В этом случае значения должны быть установлены в ini напрямую - для чистой среды разработки это может быть предпочтительнее в любом случае.
Томалак
53

Конфигурация PHP

2 записи в php.ini диктуют вывод ошибок:

  1. display_errors
  2. error_reporting

В производстве , display_errorsобычно устанавливается Off(что это хорошая вещь, потому что ошибка отображения в производственных объектах , как правило , не желательно!).

Однако в процессе разработки его следует установить Onтак, чтобы ошибки отображались. Проверьте !

error_reporting(по состоянию на PHP 5.3) по умолчанию установлено значение E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED(то есть все отображается за исключением уведомлений, строгих стандартов и уведомлений об устаревании). Если вы сомневаетесь, установите его E_ALLдля отображения всех ошибок. Проверьте !

ВОУ ВОУ! Нет проверки! Я не могу изменить свой php.ini!

Это позор. Обычно общие хосты не допускают изменения своего файла php.ini, и поэтому эта опция, к сожалению, недоступна. Но не бойся! У нас есть другие варианты !

Конфигурация времени выполнения

В желаемом скрипте мы можем изменять записи php.ini во время выполнения! Это значит, что он запустится, когда скрипт запустится! Сладкий!

error_reporting(E_ALL);
ini_set("display_errors", "On");

Эти две строки будут выполнять тот же эффект, что и изменение записей php.ini, как указано выше! Потрясающие!

Я все еще получаю пустую страницу / ошибка 500!

Это означает, что сценарий даже не запускался! Это обычно происходит, когда у вас есть синтаксическая ошибка!

С синтаксическими ошибками сценарий даже не попадает во время выполнения. Сбой во время компиляции , это означает, что он будет использовать значения в php.ini, которые, если вы не изменились, могут не разрешить отображение ошибок.

Журналы ошибок

Кроме того, PHP по умолчанию регистрирует ошибки. На виртуальном хостинге он может находиться в отдельной папке или в той же папке, что и скрипт-нарушитель.

Если у вас есть доступ к php.ini, вы можете найти его под error_logзаписью.

Призрак Мадары
источник
30

Существует действительно полезное расширение под названием « xdebug », которое сделает ваши отчеты намного приятнее.

gnarf
источник
2
Действительно, это очень полезный инструмент отладки - делает сообщения об ошибках гораздо более подробными, с полными трассировками стека, дампами переменных и всем остальным.
hbw
2
Да. А затем используйте что-то вроде плагина VimDebugger, чтобы пройтись по своему коду и выяснить, где он идет не так.
Сандер Марешал
1
NetBeans с xdebug здесь. Это так круто. Я новичок в PHP (обычно ASP.NET) и раньше выполнял операторы echo.
Некоторые Canuck
30

Я всегда использую этот синтаксис в самом верху скрипта php.

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On');  //On or Off
FDisk
источник
3
Я извиняюсь, но -1 за то, что не прочитал другие ответы, уже опубликованные Об этом позаботятся в .htaccess, как уже упоминалось несколько раз.
Мэтью Шарли
12
обычный «бесплатный хостинг» игнорирует .htaccess
FDisk
27

Для быстрого, практического устранения неисправностей я обычно предлагаю здесь на SO:

error_reporting(~0); ini_set('display_errors', 1);

чтобы быть помещенным в начало сценария, который находится под устранением неполадок. Это не идеально, идеальным вариантом является то, что вы также включаете это вphp.ini и что вы регистрируете ошибки в PHP для обнаружения синтаксиса и ошибок при запуске.

В приведенных здесь настройках отображаются все ошибки, уведомления и предупреждения, в том числе строгие, независимо от версии PHP.

Следующие вещи для рассмотрения:

  • Установите Xdebug и включите удаленную отладку с помощью вашей IDE.

Смотрите также:

hakre
источник
27

Можно зарегистрировать ловушку, чтобы сделать видимой последнюю ошибку или предупреждение.

function shutdown(){
  var_dump(error_get_last());
}

register_shutdown_function('shutdown');

добавление этого кода в начало вашего index.php поможет вам отладить проблемы.

Эдуардо Оливейра
источник
1
Это чистое золото для людей, которые застряли в веб-хостах, которые не показывают ошибок, но допускают нулевой доступ к журналу
Рафаэль Мена Баррето
18

Это проблема загрузки и конфигурации во время выполнения

Важно признать, что синтаксическая ошибка или ошибка синтаксического анализа происходят во время этапа компиляции или синтаксического анализа , что означает, что PHP будет запускаться до того, как у него даже появится шанс выполнить любой ваш код. Так что, если вы изменяете display_errorsконфигурацию PHP во время выполнения (это включает в себя что-либо от использования ini_setв вашем коде до использования .htaccess, который является файлом конфигурации времени выполнения), тогда будут задействованы только загруженные параметры конфигурации по умолчанию .

Как всегда избегать WSOD в разработке

Чтобы избежать WSOD вы хотите , чтобы убедиться , что ваш загруженный файл конфигурации имеет display_errorsна и error_reportingнабор для -1( это эквивалентно E_ALL , поскольку он гарантирует , что все биты включены , независимо от того, какой версии PHP вы бежите ). Не задавайте жестко постоянное значение E_ALL, потому что это значение может меняться в разных версиях PHP.

Loaded конфигурации или ваш загруженный php.iniфайл или ваш apache.confили httpd.confили VirtualHost файла. Эти файлы читаются только один раз на этапе запуска (например, при первом запуске apache httpd или php-fpm) и переопределяются только изменениями конфигурации среды выполнения. Убедившись , что display_errors = 1и error_reporting = -1в ваших загруженных файлов конфигурации обеспечивает проведение, что вы никогда не будете видеть WSOD независимо от синтаксиса или синтаксического анализа ошибок , которые происходят до изменения времени выполнения , как ini_set('display_errors', 1);или error_reporting(E_ALL);может иметь место.

Как найти ваши (php.ini) загруженные файлы конфигурации

Чтобы найти загруженные файлы конфигурации, просто создайте новый файл PHP только со следующим кодом ...

<?php
phpinfo();

Затем направьте туда свой браузер и посмотрите на проанализированный загруженный файл конфигурации и дополнительные INI-файлы , которые обычно находятся вверху phpinfo()и будут содержать абсолютный путь ко всем загруженным файлам конфигурации.

Если вы видите (none)вместо файла, это означает, что у вас нет php.ini в пути к файлу конфигурации (php.ini) . Таким образом, вы можете скачать отсюда php.ini, поставляемый в комплекте с PHP, и скопировать его в путь к файлу конфигурации как php.ini, а затем убедиться, что у вашего пользователя php достаточно прав для чтения из этого файла. Вам нужно будет перезапустить httpd или php-fpm, чтобы загрузить его. Помните, что это файл разработки php.ini, который поставляется в комплекте с источником PHP. Поэтому, пожалуйста, не используйте его в производстве!


Только не делай этого в производстве

Это действительно лучший способ избежать WSOD в разработке. Любой, кто предложит вам поместить ini_set('display_errors', 1);или error_reporting(E_ALL);наверх вашего скрипта PHP или использовать .htaccess, как вы сделали здесь, не поможет вам избежать WSOD, когда возникает синтаксическая ошибка или ошибка синтаксического анализа (как в вашем случае здесь), если ваш загруженный файл конфигурации был display_errorsвыключен.

Многие люди (и стандартные установки PHP) будут использовать производственный ini-файл, который display_errorsпо умолчанию отключен, что обычно приводит к тому же разочарованию, которое вы испытали здесь. Поскольку PHP уже отключил его при запуске, он сталкивается с синтаксической ошибкой или ошибкой синтаксического анализа и не выдает ничего. Вы ожидаете, что ваша ini_set('display_errors',1);верхняя часть PHP-скрипта должна была этого избежать, но не имеет значения, если PHP не сможет проанализировать ваш код, потому что он никогда не достигнет времени выполнения.

шериф
источник
17

Если вы супер крутой, вы можете попробовать:

$test_server = $_SERVER['SERVER_NAME'] == "127.0.0.1" || $_SERVER['SERVER_NAME'] == "localhost" || substr($_SERVER['SERVER_NAME'],0,3) == "192";

ini_set('display_errors',$test_server);
error_reporting(E_ALL|E_STRICT);

Это будет отображать только ошибки, когда вы работаете локально. Он также дает вам переменную test_server для использования в других местах, где это необходимо.

Любые ошибки, которые происходят до запуска скрипта, не будут обнаружены, но для 99% ошибок, которые я делаю, это не проблема.

Рич Брэдшоу
источник
2
Если вы различаете локальную и производственную среды, вы должны просто включать или отключать ошибки глобально (в вашем php.ini), а не в коде, который также может быть рабочим кодом. Если вам нужно отладить производственный веб-сайт в его производственной среде и вы хотите, чтобы вы только могли просматривать ошибки, используйте, $_SERVER['REMOTE_HOST']чтобы проверить, является ли клиент, ну, в общем, вы.
Яап Хаагманс
17

В верхней части страницы выберите параметр

error_reporting(E_ERROR | E_WARNING | E_PARSE);
KLD
источник
16

Чтобы сохранить это и сделать его совместимым, вы можете отредактировать файл php.ini. Обычно он хранится в /etc/php.iniили /etc/php/php.ini, но более локальные php.iniмогут перезаписывать его, в зависимости от рекомендаций по настройке вашего хостинг-провайдера. Проверьте phpinfo()файл Loaded Configuration Fileвверху, чтобы убедиться, какой из них загружается последним.

Найдите display_errors в этом файле. Должно быть только 3 экземпляра, из которых 2 прокомментированы.

Измените незакомментированную строку на:

display_errors = stdout
Баран
источник
16

Не знаю, поможет ли это, но вот часть моего стандартного конфигурационного файла для проектов php. Я склонен не слишком сильно зависеть от настроек apache даже на моем собственном сервере.

У меня никогда не было проблемы с исчезающей ошибкой, поэтому, возможно, что-то здесь даст вам представление.

Отредактировано, чтобы показать APPLICATON_LIVE

/*
APPLICATION_LIVE will be used in process to tell if we are in a development or production environment.  It's generally set as early as possible (often the first code to run), before any config, url routing, etc.
*/

if ( preg_match( "%^(www.)?livedomain.com$%", $_SERVER["HTTP_HOST"]) ) {
    define('APPLICATION_LIVE', true);
} elseif ( preg_match( "%^(www.)?devdomain.net$%", $_SERVER["HTTP_HOST"]) ) {
    define('APPLICATION_LIVE', false);
} else {
    die("INVALID HOST REQUEST (".$_SERVER["HTTP_HOST"].")");
    // Log or take other appropriate action.
}


/*
--------------------------------------------------------------------
DEFAULT ERROR HANDLING
--------------------------------------------------------------------
Default error logging.  Some of these may be changed later based on APPLICATION_LIVE.
*/
error_reporting(E_ALL & ~E_STRICT);
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");
ini_set ( "log_errors", 1);
ini_set ( "log_errors_max_len", 0);
ini_set ( "error_log", APPLICATION_ROOT."logs/php_error_log.txt");
ini_set ( "display_errors", "0");
ini_set ( "display_startup_errors", "0");

if ( ! APPLICATION_LIVE ) {
    // A few changes to error handling for development.
    // We will want errors to be visible during development.
    ini_set ( "display_errors", "1");
    ini_set ( "display_startup_errors", "1");
    ini_set ( "html_errors", "1");
    ini_set ( "docref_root", "http://www.php.net/");
    ini_set ( "error_prepend_string", "<div style='color:red; font-family:verdana; border:1px solid red; padding:5px;'>");
    ini_set ( "error_append_string", "</div>");
}
Eli
источник
@Eli, у этого есть издержки времени выполнения, хотя, для запроса страницы .
Pacerier
до 1 за концепцию, которая игнорирует настройки отладки, однако сервер настроен, хорошо, когда вы развертываете или поддерживаете (в разработке)
justnajm
15
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);

Кроме того, вы можете получить более подробную информацию с помощью xdebug .

Yan.Zero
источник
Xdebug можно включить с php.ini
jewelhuq
15

Я рекомендую Nette Tracy для лучшей визуализации ошибок и исключений в PHP:

Нетт Трейси скриншот

Ондржей Шотек
источник
3
Трейси позаботится о правильной настройке всех отображаемых ошибок и опций отчетов об ошибках, чтобы обеспечить вывод в таких ситуациях, как описано в оригинальном сообщении ... Так что этот инструмент особенно полезен для решения вопроса "Может ли кто-нибудь порекомендовать хорошие советы по отладке PHP, инструменты и методы? ».
Ян Драбек
15
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Абузер Фирдоуси
источник
10
error_reporting(E_ALL | E_STRICT);

И включить отображение ошибок в php.ini

Олафур Вааге
источник
9

Вы можете зарегистрировать свой собственный обработчик ошибок в PHP. Например, выгрузка всех ошибок в файл может помочь вам в этих непонятных случаях. Обратите внимание, что ваша функция будет вызываться независимо от того, какая у вас текущая error_reporting . Очень простой пример:

function dump_error_to_file($errno, $errstr) {
    file_put_contents('/tmp/php-errors', date('Y-m-d H:i:s - ') . $errstr, FILE_APPEND);
}
set_error_handler('dump_error_to_file');
soulmerge
источник
7

Две ключевые строки, которые вам нужны, чтобы получить полезные ошибки из PHP:

ini_set('display_errors',1);
 error_reporting(E_ALL);

Как отмечают другие участники, они отключены по умолчанию из соображений безопасности. Полезный совет: когда вы настраиваете свой сайт, удобно переключаться между различными средами, чтобы эти ошибки были включены по умолчанию в вашей локальной среде и среде разработки. Это может быть достигнуто с помощью следующего кода (в идеале, в вашем index.php или конфигурационном файле, чтобы он был активен с самого начала):

switch($_SERVER['SERVER_NAME'])
{
    // local
    case 'yourdomain.dev':
    // dev
    case 'dev.yourdomain.com':
        ini_set('display_errors',1);
        error_reporting(E_ALL);
    break;
    //live
    case 'yourdomain.com':
        //...
    break;
}
Синтез кода
источник
6

FirePHP также может быть полезен.

Рич Брэдшоу
источник
Я должен отметить, что FirePHP - мертвый проект, так как FireBug был интегрирован в консоль Firefox. ChromePHP является своего рода преемником, но не полностью.
Мачавити
6

откройте свой php.ini, убедитесь, что он установлен на:

display_errors = On

перезагрузите ваш сервер.

user577803
источник
6

Вы также можете попробовать PHPStorm в качестве редактора кода. Он найдет много PHP и других синтаксических ошибок, как вы печатаете в редакторе.

user1681048
источник
6

если вы пользователь Ubuntu, перейдите в свой терминал и выполните эту команду

sudo tail -50f /var/log/apache2/error.log

где будет отображаться последние 50 ошибок. Для error.logapache2 существует файл ошибок, в котором записываются все ошибки.

Ашутош Джа
источник
5

Чтобы включить полный отчет об ошибках, добавьте это в ваш скрипт:

error_reporting(E_ALL);

Это приводит к появлению даже минимальных предупреждений. И на всякий случай:

ini_set('display_errors', '1');

Принудительно отобразит ошибки. Это должно быть отключено на производственных серверах, но не во время разработки.

Даниэль Сорикетти
источник
Как и в случае с ответом Томалака, это не работает для синтаксических ошибок.
Дэррил Хейн
5

«ОШИБКИ» - это самые полезные вещи для разработчиков, чтобы знать о своих ошибках и исправлять их, чтобы система работала идеально.

PHP предоставляет некоторые из лучших способов узнать разработчиков, почему и где их часть кода получает ошибки, поэтому, зная эти ошибки, разработчики могут улучшить свой код разными способами.

Лучшие способы написать следующие две строки в верхней части скрипта, чтобы получить все сообщения об ошибках:

error_reporting(E_ALL);
ini_set("display_errors", 1);

Еще один способ использовать инструменты отладки, такие как xdebug, в вашей IDE.

Janyk
источник
4

Вы можете включить полный отчет об ошибках (включая уведомления и строгие сообщения). Некоторые люди находят это слишком многословным, но это стоит попробовать. Набор error_reportingдля E_ALL | E_STRICTвашей php.ini.

error_reporting = E_ALL | E_STRICT

E_STRICT уведомит вас об устаревших функциях и даст рекомендации о лучших методах выполнения определенных задач.

Если вы не хотите получать уведомления, но считаете полезными другие типы сообщений, попробуйте исключить уведомления:

error_reporting = (E_ALL | E_STRICT) & ~E_NOTICE

Также убедитесь, что display_errorsон включен в php.ini. Если ваша версия PHP старше, чем 5.2.4, установите для нее On:

display_errors = "On"

Если ваша версия 5.2.4 или новее, используйте:

display_errors = "stderr"
Айман Хуриех
источник
4

Помимо параметра error_reporting и ini display_errors, вы можете получить ошибки SYNTAX из файлов журнала вашего веб-сервера. Когда я разрабатываю PHP, я загружаю журналы веб-сервера своей системы разработки в мой редактор. Всякий раз, когда я тестирую страницу и получаю пустой экран, файл журнала устаревает, и мой редактор спрашивает, хочу ли я его перезагрузить. Когда я делаю, я прыгаю на дно, и есть синтаксическая ошибка. Например:

[Sun Apr 19 19:09:11 2009] [error] [client 127.0.0.1] PHP Parse error:  syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in D:\\webroot\\test\\test.php on line 9
jmucchiello
источник
3

Для тех, кто использует nginx и имеет белый экран даже для файла с <?php echo 123;. В моем случае у меня не было этой обязательной опции для PHP в конфигурационном файле nginx:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Эта опция отсутствовала в файле fastcgi_params, поэтому PHP не работал и в логах не было ошибок.

AVKurov
источник
У меня была та же проблема, и это связано с тем, что в файле конфигурации по умолчанию Nginx отсутствует эта строка.
Салем,