Я проверил, что мой файл инициализации PHP (php.ini
) и display_errors
установлен, а также сообщение об ошибке E_ALL
. Я перезапустил свой веб-сервер Apache.
Я даже поместил эти строки в верхнюю часть моего скрипта, и он даже не улавливает простые ошибки анализа. Например, я объявляю переменные с " $"
и не закрываю операторы";"
. Но все мои сценарии показывают пустую страницу об этих ошибках, но я хочу видеть ошибки в выходе моего браузера.
error_reporting(E_ALL);
ini_set('display_errors', 1);
Что осталось сделать?
Это всегда работает для меня
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Однако это не делает PHP показывать ошибки анализа - единственный способ показать эти ошибки - это изменить ваш php.ini с помощью этой строки:
display_errors = on
(если у вас нет доступа к php.ini
, то и размещение этой строки в .htaccess
может работать):
php_flag display_errors 1
Вы не можете поймать ошибки анализа при включении вывода ошибки во время выполнения, потому что он анализирует файл перед фактическим выполнением чего-либо (и поскольку во время этого происходит ошибка, он ничего не выполняет). Вам нужно будет изменить фактическую конфигурацию сервера, чтобы отображались ошибки отображения и использовался уровень erroriate error_reporting. Если у вас нет доступа к php.ini, вы можете использовать .htaccess или аналогичный, в зависимости от сервера.
Этот вопрос может предоставить дополнительную информацию.
Внутри вашего php.ini :
display_errors = on
Затем перезагрузите веб-сервер.
Чтобы отобразить все ошибки, вам нужно:
1. Имейте эти строки в скрипте PHP, который вы вызываете из браузера (обычно index.php
):
error_reporting(E_ALL);
ini_set('display_errors', '1');
2.(a) Убедитесь, что в этом сценарии нет синтаксических ошибок
2.(b) Установите display_errors = On
в вашем php.ini
В противном случае он не может даже запустить эти 2 строки!
Вы можете проверить синтаксические ошибки в вашем скрипте, выполнив (в командной строке):
php -l index.php
Если вы включите скрипт из другого скрипта PHP, то он отобразит синтаксические ошибки в скрипте included . Например:
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 в файле .htaccess
.
Вы можете добавить следующую строку:
php_value display_errors 1
У меня была та же проблема, что и у вас, и это решение исправило ее.
Вы можете обнаружить, что все настройки для «отчетов об ошибках» или «об ошибках отображения» не работают в PHP & nbsp; 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 & nbsp; 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'];
}
Это будет работать:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>
Использовать:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Это лучший способ написать это, но синтаксическая ошибка дает пустой вывод, поэтому используйте консоль для проверки синтаксических ошибок. Лучший способ отладить код PHP - использовать консоль; запустить следующее:
php -l phpfilename.php
Установите это в свой файл index.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.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 {
...
}
Я обычно использую следующий код в своих простых проектах 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 = 'Production URL'; /* https://google.com */
error_reporting(0);
/* Mechanism to log errors */
break;
default:
exit('The application environment is not set correctly.');
}
}
При использовании 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 7, приведенные здесь ответы больше не верны. Единственный, кто все еще в порядке, это тот, что от Фрэнка Форте, когда он говорит о PHP & nbsp; 7.
С другой стороны, вместо того, чтобы пытаться поймать ошибки с помощью попытки / уловки, вы можете использовать трюк: используйте include.
Здесь три фрагмента кода:
Файл: tst1.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
// Missing " and ;
echo "Testing
?>
Запуск этого в PHP & nbsp; 7 ничего не покажет.
Теперь попробуйте это:
Файл: 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 в строке 4
Если вы каким-то образом оказались в ситуации, когда вы не можете изменить настройку с помощью 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.";
}
Вы можете сделать что-то вроде ниже:
Установите следующие параметры в главном файле индекса:
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);
Для получения дополнительной информации проверьте здесь.
Вы можете добавить свой собственный обработчик ошибок, который может предоставить дополнительную информацию отладки. Кроме того, вы можете настроить его для отправки вам информации по электронной почте.
function ERR_HANDLER($errno, $errstr, $errfile, $errline){
$msg = "<b>Something 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");
Этот код сверху должен работать:
error_reporting(E_ALL);
Однако попробуйте отредактировать код на телефоне в файле:
error_reporting =on
Лучшее / простое / быстрое решение, которое вы можете использовать при быстрой отладке, - это окружить ваш код перехватами исключений. Это то, что я делаю, когда хочу проверить что-то быстрое в производстве.
try {
// Page code
}
catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}