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

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

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

Итак, есть ли способ заставить PHP генерировать полезное сообщение об ошибке, как это делает Java? Кто-нибудь может порекомендовать хорошие советы и приемы отладки PHP?

Ответы [ 26 ]

3 голосов
/ 10 мая 2009

Вы можете включить полный отчет об ошибках (включая уведомления и строгие сообщения). Некоторые люди находят это слишком многословным, но это стоит попробовать. Установите 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"
3 голосов
/ 10 мая 2009

Помимо 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
1 голос
/ 17 мая 2019

Этот ответ доставляет вам отдел резервирования.

  1. ini_set() / php.ini / .htaccess / .user.ini

    Настройки display_errors и error_reporting уже достаточно освещены. Но просто напомнить, когда использовать какую опцию:

    • ini_set() и error_reporting() применяются только к ошибкам во время выполнения.
    • php.ini следует в первую очередь редактировать для настроек разработки. (Web-сервер и CLI-версия часто имеют разные php.ini)
    • .htaccess флаги работают только для устаревших настроек (найдите нового хостера! Хорошо управляемые серверы дешевле.)
    • .user.ini - частичные php.ini для современных установок (FCGI / FPM)

    И в качестве грубой альтернативы для ошибок времени выполнения вы часто можете использовать:

    set_error_handler("var_dump");   // ignores error_reporting and `@` suppression
    
  2. error_get_last()

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

  3. $php_errormsg

    Суперлокальная переменная, которая также содержит последнее сообщение времени выполнения PHP.

  4. isset() извини!

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

    Многие вопросы «что-то не работает», которые мы получаем в последнее время, являются результатом таких опечаток, как:

    if(isset($_POST['sumbit']))
    #                  ↑↑
    

    Вы не получите никаких полезных уведомлений, если ваш код будет усеян isset / empty / array_keys_exists. Иногда разумнее использовать @, поэтому уведомления и предупреждения, по крайней мере, попадают в журналы.

  5. assert_options(ASSERT_ACTIVE|ASSERT_WARNING);

    Для получения предупреждений для assert() разделов. (Довольно редко, но более искусный код может содержать некоторые из них.)

    PHP7 также требует zend.assertions=1 в php.ini.

  6. declare(strict_types=1);

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

  7. PDO / MySQLi

    И @Phil уже упомянул Опции сообщений об ошибках PDO / MySQLi . Подобные опции существуют и для других API баз данных.

  8. json_last_error() + json_last_error_msg

    Для анализа JSON.

  9. preg_last_error()

    Для регулярных выражений.

  10. CURLOPT_VERBOSE

    Чтобы отлаживать запросы curl, вам нужно как минимум CURLOPT_VERBOSE.

  11. shell/exec()

    Аналогично, выполнение команды оболочки само по себе не приведет к ошибкам. Вам всегда нужно 2>&1 и посмотреть на $ errno.

1 голос
/ 14 сентября 2018

В дополнение ко всем замечательным ответам здесь я хотел бы особо упомянуть библиотеки MySQLi и PDO.

Для того, чтобы ...

  1. Всегда видеть ошибки, связанные с базой данных, и
  2. Старайтесь не проверять типы возвращаемых данных для методов, чтобы увидеть, что-то пошло не так

Наилучший вариант - настроить библиотеки на выбросить исключения .

MySQLi

Добавьте это в верхней части вашего скрипта

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Лучше всего перед тем, как использовать new mysqli() или mysqli_connect().

PDO

Установите для атрибута PDO::ATTR_ERRMODE значение PDO::ERRMODE_EXCEPTION в вашем экземпляре соединения. Вы можете сделать это в конструкторе

$pdo = new PDO('driver:host=localhost;...', 'username', 'password', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

или после создания

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
0 голосов
/ 15 июня 2013

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

Таким образом, я всегда создаю файл / программу (которую я обычно называю «genwrap.php»), в которой, по сути, используется тот же код, что и в популярном здесь решении (т. Е. Включаю отчет об ошибках), а затем он также включает страницу на самом деле хочу позвонить.

Есть 2 шага для реализации этой отладки;

One - создайте genwrap.php и вставьте в него этот код:

<?php
error_reporting(-1);
ini_set('display_errors', 'On');

include($_REQUEST['page']);
?>

Два - изменить ссылку на программу / страницу, которую вы хотите отладить, чтобы перейти через genwrap.php,

Например: изменить:

$.ajax('dir/pgm.php?param=val').done(function(data) { /* ... */

до

$.ajax('dir/genwrap.php?page=pgm.php&param=val').done(function(data) { /* ... */
0 голосов
/ 07 марта 2015

В дополнение к очень многим превосходным ответам, приведенным выше, вы также можете реализовать следующие две функции в своих проектах. Они будут ловить каждую несинтаксическую ошибку перед выходом из приложения / скрипта. Внутри функций вы можете сделать обратный след и войти или сделать приятное сообщение «Сайт находится на обслуживании» для общественности.

Фатальные ошибки:

register_shutdown_function

http://php.net/manual/en/function.register-shutdown-function.php

Ошибка:

set_error_handler

http://php.net/manual/en/function.set-error-handler.php

обратная трассировка:

debug_backtrace

http://php.net/manual/en/function.debug-backtrace.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...