Я нахожу программирование на PHP довольно расстраивающим. Довольно часто я буду пытаться запустить script и просто получить пустой экран обратно. Нет сообщения об ошибке, только пустой экран. Причиной могла быть простая синтаксическая ошибка (неправильная скобка, отсутствующая точка с запятой) или неудачный вызов функции или что-то еще.
Очень сложно понять, что пошло не так. Я в конечном итоге комментирую код, вводя "эхо" заявления везде и т.д., Пытаясь сузить проблему. Но, безусловно, должен быть лучший способ, верно?
Итак, есть ли способ заставить PHP создавать полезные сообщения об ошибках, подобные Java? Кто-нибудь может рекомендовать хорошие советы, инструменты и методы отладки PHP?
Для синтаксических ошибок вам нужно включить отображение ошибок в php.ini. По умолчанию они отключены, потому что вы не хотите, чтобы "клиент" видел сообщения об ошибках. Проверьте эту страницу в документации по PHP для получения информации по двум директивам: 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) Добавление следующих двух строк поможет вам отлаживать ошибки, которые не являются синтаксическими ошибками:
error_reporting(-1);
ini_set('display_errors', 'On');
(3) Другой вариант - использовать редактор, который проверяет наличие ошибок при вводе, например PhpEd. PhpEd также поставляется с отладчиком, который может предоставить более подробную информацию. (Отладчик PhpEd очень похож на xdebug и интегрируется непосредственно в редактор, поэтому вы используете 1 программу для выполнения всего.)
Картман ссылка также очень хороша: http://www.ibm.com/developerworks/library/os-debug/
Ниже перечислены все ошибки:
ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
error_reporting(-1);
Также см. следующие ссылки
Вы можете включить следующие строки в файл, который вы хотите отлаживать:
error_reporting(E_ALL);
ini_set('display_errors', '1');
Это переопределяет настройки по умолчанию в php.ini, которые просто заставляют PHP сообщать об ошибках в журнал.
2 записи в php.ini диктуют вывод ошибок:
В production display_errors
обычно устанавливается Off
(что хорошо, потому что отображение ошибок на производственных сайтах обычно нежелательно!).
Однако в разработке он должен быть установлен в On
, чтобы отображались ошибки. Проверить
error_reporting
(начиная с PHP 5.3) устанавливается по умолчанию как E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
(что означает, что все отображается за исключением уведомлений, строгих стандартов и уведомлений об отказе). Если вы сомневаетесь, установите E_ALL
для отображения ошибок all. Проверить
Это позор. Обычно общие хосты не позволяют изменять файл php.ini, и поэтому этот параметр, к сожалению, недоступен. Но не бойся! У нас есть другие возможности!
В желаемом script мы можем изменить записи php.ini во время выполнения! Значит, он будет запускаться при запуске script! Классно!
error_reporting(E_ALL);
ini_set("display_errors", "On");
Эти две строки будут делать тот же эффект, что и изменение записей php.ini, как указано выше! Отлично!
Это означает, что script даже не запустился! Обычно это происходит, когда у вас есть синтаксическая ошибка!
С синтаксическими ошибками, script даже не доходит до времени выполнения. Он не работает время компиляции, что означает, что он будет использовать значения в php.ini, которые, если вы не изменились, могут не допускать отображения ошибок.
Кроме того, PHP по умолчанию регистрирует ошибки. На общем хостинге он может находиться в выделенной папке или в той же папке, что и нарушающий script.
Если у вас есть доступ к php.ini, вы можете найти его в разделе error_log
.
Существует действительно полезное расширение, называемое xdebug, что сделает ваши отчеты намного приятнее.
Для быстрого практического устранения неисправностей я обычно предлагаю здесь на SO:
error_reporting(~0); ini_set('display_errors', 1);
который будет помещен в начало script, который находится в режиме устранения неполадок. Это не идеально, идеальным вариантом является то, что вы также включаете это в php.ini
и регистрируете ошибки в PHP, чтобы уловить синтаксис и ошибки при запуске.
В приведенных здесь настройках отображаются все ошибки, уведомления и предупреждения, в том числе строгие, независимо от того, какая версия PHP.
Далее следует рассмотреть:
Смотрите также:
Если вы супер крутой, вы можете попробовать:
$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 для использования в других местах, где это необходимо.
Любые ошибки, которые происходят до запуска script, не будут обнаружены, но для 99% ошибок, которые я делаю, это не проблема.
$_SERVER['REMOTE_HOST']
чтобы проверить, является ли клиент именно вами.
В верхней части страницы выберите параметр
error_reporting(E_ERROR | E_WARNING | E_PARSE);
Чтобы сохранить это и сделать его confortale, вы можете отредактировать файл php.ini. Обычно он хранится в /etc/php.ini
или /etc/php/php.ini
, но более локальный php.ini
может перезаписать его, в зависимости от рекомендаций по настройке вашего хостинг-провайдера. Проверьте файл phpinfo()
на Loaded Configuration File
вверху, чтобы убедиться, что последний загружен последним.
Найти display_errors в этом файле. Должно быть только 3 экземпляра, из которых 2 комментируются.
Измените строку без комментирования на:
display_errors = stdout
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
ini_set('html_errors', 1);
Кроме того, вы можете получить более подробную информацию с помощью xdebug.
Я рекомендую Nette Tracy для лучшей визуализации ошибок и исключений в PHP:
error_reporting(E_ALL | E_STRICT);
И включите ошибки отображения в php.ini
Вы можете зарегистрировать свой собственный обработчик ошибок в 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');
Вы также можете попробовать PHPStorm в качестве редактора кода. Он найдет много PHP и других синтаксических ошибок, как вы набираете в редакторе.
Две ключевые строки, необходимые для получения полезных ошибок из PHP:
ini_set('display_errors',1);
error_reporting(E_ALL);
Как указывали другие участники, они по умолчанию отключены по соображениям безопасности. В качестве полезного совета - когда вы настраиваете свой сайт, вам удобно использовать коммутатор для разных сред, чтобы эти ошибки были включены по умолчанию в вашей локальной среде и средах разработки. Это может быть достигнуто с помощью следующего кода (в идеале, в вашем файле index.php или config, так что он активен с самого начала):
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;
}
Попробуйте этот справочный инструмент отчетности об ошибках PHP. Это очень хорошая визуальная ссылка и помогла мне понять механизм создания сложных ошибок.
если вы пользователь ubuntu, затем перейдите к своему терминалу и запустите эту команду
sudo tail -50f /var/log/apache2/error.log
где будут отображаться последние 50 ошибок.
Существует файл ошибки error.log
для apache2, который регистрирует все ошибки.
FirePHP также может быть полезен.
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
"ОШИБКИ" являются наиболее полезными для разработчиков, чтобы знать свои ошибки и разрешать их, чтобы система работала идеально.
PHP предоставляет некоторые из лучших способов узнать разработчиков, почему и где их часть кода получает ошибки, поэтому, зная эти ошибки, разработчики могут сделать свой код лучше во многих отношениях.
Лучшие способы записи следующих двух строк в верхней части script для получения всех сообщений об ошибках:
error_reporting(E_ALL);
ini_set("display_errors", 1);
Другой способ использования инструментов отладчика, таких как xdebug в вашей среде IDE.
Помимо параметров error_reporting и display_errors ini, вы можете получить ошибки 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
Чтобы включить полное сообщение об ошибках, добавьте его в свой script:
error_reporting(E_ALL);
Это приводит к появлению даже минимальных предупреждений. И, на всякий случай:
ini_set('display_errors', '1');
Усилит отображение ошибок. Это должно быть отключено на рабочих серверах, но не при разработке.
Вы можете включить полное сообщение об ошибках (включая уведомления и строгие сообщения). Некоторые люди считают это слишком многословным, но стоит попробовать. Установите 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"
В дополнение ко всем замечательным ответам здесь я хотел бы особо упомянуть библиотеки MySQLi и PDO.
Чтобы...
Лучший вариант - настроить библиотеки для исключения исключений.
Добавьте это в начало вашего скрипта
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Это лучше всего использовать перед использованием new mysqli()
или mysqli_connect()
.
Установите атрибут 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);
Используйте Кинт. Это комбинация команд отладки на стероидах. https://kint-php.github.io/kint/ Он очень похож на Nette Tracy
В дополнение к очень большому количеству превосходных ответов выше вы также можете реализовать следующие две функции в своих проектах. Они будут улавливать каждую несинтаксическую ошибку до выхода приложения /script. Внутри функций вы можете делать обратную трассировку и регистрировать или предоставлять приятное сообщение "Сайт под техническим обслуживанием".
Неустранимая ошибка:
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://todell.com/debug также может быть полезен. Вы можете увидеть ваши значения объекта или сбросить ошибки отладки позади сцены даже в режиме производства.
Включение отчета об ошибках - правильное решение, однако оно, похоже, не действует в программе, которая включает его, но только в последующие включенные программы.
Таким образом, я всегда создаю файл/программу (которую я обычно называю "genwrap.php" ), которая имеет по существу тот же самый код, что и популярное решение здесь (т.е. включить отчет об ошибках), а также включает страницу я на самом деле хотите позвонить.
Есть два шага для реализации этой отладки:
Один - создайте genwrap.php и поместите в него этот код:
<?php
error_reporting(-1);
ini_set('display_errors', 'On');
include($_REQUEST['page']);
?>
Два - измените ссылку на программу/страницу, которую вы хотите отлаживать, чтобы перейти через genwrap.php,
Например: change:
$.ajax('dir/pgm.php?param=val').done(function(data) { /* ... */
к
$.ajax('dir/genwrap.php?page=pgm.php¶m=val').done(function(data) { /* ... */
Моя обычная проблема - это "маленькие, глупые" ошибки парсера, которые, к сожалению, не отображаются.
Однако, когда файл .PHP файл содержит файл с ошибками парсера, они отображаются!
Поэтому у меня возникла идея написать небольшой "executor- script", который запускается с именем файла с ошибкой в качестве аргумента, т.е. example.com/sx.php?sc=buggy.php
Это уже спасло меня от большой головной боли, возможно, это будет полезно и для кого-то другого:)
sx.php
$sc = $_GET["sc"];
if ((!isset($_GET["sc"]) && empty($_GET["sc"]))) {
echo "Please select file to execute using ?sc= (you may omit the .PHP-extension)";
} else {
$sc = $_GET["sc"];
if (false==stripos('.php',$sc)) $sc.='.php'; // adjust this if your preferred extension is php5!
require($sc);
}
?>