Openserver php не показывает ошибки

Перепробовал все приемы что есть по ссылке

https://karashchuk.com/PHP/error_reporting-display_errors-display_startup_errors/

Пример ошибок которые хочу видеть:

PHP Notice:  Trying to access array offset on value of type null in ...

Google не дает результатов.

php.ini

; ----------------------------
; Error reporting
; ----------------------------

display_errors              = "1"
display_startup_errors      = on
error_reporting              = E_ALL
error_log                    = "e:/other/os/ospanel/userdata/logs/PHP_7.3-x64_error.log"
;html_errors                 = on
;ignore_repeated_errors      = off
;ignore_repeated_source      = off
log_errors                   = on
;log_errors_max_len          = 1024
report_memleaks              = off
report_zend_debug            = off
;track_errors                = off
;windows.show_crt_warning    = off
;xmlrpc_errors               = off
;xmlrpc_error_number         = 0

  • Главная

    Список форумов

    Ошибки Open Server

  • Поиск

    • Текущее время: 21 сен 2023, 16:25
    • Часовой пояс: UTC+03:00

singlewolf

Сообщения: 1
Зарегистрирован: 15 ноя 2012, 18:05

Вывод PHP-ошибок

Есть забавная проблемка.
По умолчанию вывод ошибок PHP включен, но если это включение продублировать в .htaccess то будет следующее:
php_flag display_errors On/Off — нормально велючает, отключает ошибки
php_flag display_startup_errors On — ошибки перестают выводиться в принципе, вне зависимости от установок display_errors
php_value error_reporting «E_ALL & ~E_NOTICE» — ошибки перестают выводиться в принципе, вне зависимости от установок display_errors
Если эти параметры задавать не в .htaccess, а в самом скрипте — все ошибки нормально выводятся/скрываются.

Аватара пользователя

Максим

Сообщения: 6015
Зарегистрирован: 11 дек 2010, 20:29

Непрочитанное сообщение

Максим »

Читайте документацию по PHP:

Использование PHP констант за пределами PHP, например в файле httpd.conf, не имеет смысла, так как в таких случаях требуются целочисленные значения (integer).

Т.е. так писать нельзя: php_value error_reporting «E_ALL & ~E_NOTICE»

Константы для ошибок тут:
http://www.php.net/manual/ru/errorfunc.constants.php

И для E_ALL & ~E_NOTICE там ничего нет. Так что делайте установку ошибок в конфиге PHP или в своих скриптах и не мучайте себя.

Закрались мысли, что что-то поменялось в ядре PHP 7.x, то ли у меня в системе какой-то комплексный баг.
Что-то на этапе парсинга или интерпретации скрипта происходит.. Но что?
Позже натокнулся на сайте php.net/manual/en/language.errors.php7.php на упоминание, что в PHP 7.0 поменялась методика обработки ошибок:

Ну так всё верно!
Из справки по PHP7

Код: Выделить всё
Многие фатальные и поправимые фатальные ошибки были переделаны в исключения в PHP 7. Эти исключения наследуют класс Error, который, в свою очередь, реализует интерфейс Throwable (новый базовый интерфейс, который наследуют все исключения).

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

Код: Выделить всё
В PHP 7 механизм сообщения об ошибках был сильно изменен. Традиционное оповещение об ошибке в PHP 5 было заменено новым механизмом, в котором большинство ошибок вызываются с помощью исключений класса Error.

Как и обычные исключения, исключения Error вызываются до появления первого соответствующего блока catch. Если соответствующие блоки не предусмотрены, то будет вызван любой обработчик исключений, установленный с помощью set_exception_handler(). В случае отсутствия обработчика по умолчанию, исключение будет конвертировано в фатальную ошибку и будет обработано как традиционная ошибка.

Поскольку класс Error не наследуется от класса Exception, блок catch (Exception $e) { ... } для обработки неперехваченных исключений PHP 5 не может перехватить исключения Error. Для их перехвата используйте блок catch (Error $e) { ... } или установите обработчик исключений с помощью set_exception_handler().

И ещё, важно сказать

Если у вас PHP не показывает ошибки совсем — только белая страница

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

Код: Выделить всё
display_errors = on

Если доступа к php.ini нет, то можно в
.htaccess прописать

Код: Выделить всё
php_flag display_errors on
php_flag display_startup_errors on

Кстати, в можно задать логирование ошибок в файл

Код: Выделить всё
php_value error_log logs_directory/errors_php.log

директорию ‘logs_directory’, конечно заранее создать нужно.

Не используйте PHP-константы в конфигурационных файлах сервера!

Они там не парсятся и трактуются все как 0 ! Для сервера эти константы:

https://www.php.net/manual/en/errorfunc.constants.php

ничего не значат.
Вместо них нужно использовать битовые маски (тип int).
Например, (и учитывая, что в новых версиях PHP значение константы E_ALL может измениться) рекомендуется использовать даже не число 32767 – актуальное на сегодня для php7, а максимально большое число типа int для 32-х битной платформы – 2147483647

Т. е. в httpd.conf или в .htaccess это примерно так может выглядеть:

Код: Выделить всё
    php_flag log_errors on
    php_flag display_errors on
    php_value error_reporting 2147483647
    php_value error_log /var/www/domains/example.com/php.error.log

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

Как быстро показать все ошибки PHP

Самый быстрый способ отобразить все ошибки и предупреждения php — добавить эти строки в файл PHP:

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

Что именно делают эти строки?

Функция ini_set попытается переопределить конфигурацию, найденную в вашем ini-файле PHP.

Display_errors и display_startup_errors — это только две из доступных директив. Директива display_errors определяет, будут ли ошибки отображаться для пользователя. Обычно директива dispay_errors не должна использоваться для “боевого” режима работы сайта, а должна использоваться только для разработки.

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

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

Отображение ошибок PHP через настройки в php.ini

Если ошибки в браузере по-прежнему не отображаются, то добавьте директиву:

display_errors = on

Директиву display_errors следует добавить в ini-файл PHP. Она отобразит все ошибки, включая синтаксические ошибки, которые невозможно отобразить, просто вызвав функцию ini_set в коде PHP.

Актуальный INI-файл можно найти в выводе функции phpinfo (). Он помечен как “загруженный файл конфигурации” (“loaded configuration file”).

Отображать ошибки PHP через настройки в .htaccess

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

php_flag display_startup_errors on
php_flag display_errors on

.htaccess также имеет директивы для display_startup_errors и display_errors.

Вы можете настроить display_errors в .htaccess или в вашем файле PHP.ini. Однако многие хостинг-провайдеры не разрешают вам изменять ваш файл PHP.ini для включения display_errors.

В файле .htaccess также можно включить настраиваемый журнал ошибок, если папка журнала или файл журнала доступны для записи. Файл журнала может быть относительным путем к месту расположения .htaccess или абсолютным путем, например /var/www/html/website/public/logs.

php_value error_log logs/all_errors.log

Включить подробные предупреждения и уведомления

Иногда предупреждения приводят к некоторым фатальным ошибкам в определенных условиях. Скрыть ошибки, но отображать только предупреждающие (warning) сообщения можно вот так:

error_reporting(E_WARNING);

Для отображения предупреждений и уведомлений укажите «E_WARNING | E_NOTICE».

Также можно указать E_ERROR, E_WARNING, E_PARSE и E_NOTICE в качестве аргументов. Чтобы сообщить обо всех ошибках, кроме уведомлений, укажите «E_ALL & ~ E_NOTICE», где E_ALL обозначает все возможные параметры функции error_reporting.

Более подробно о функции error_reporting ()

Функция сообщения об ошибках — это встроенная функция PHP, которая позволяет разработчикам контролировать, какие ошибки будут отображаться. Помните, что в PHP ini есть директива error_reporting, которая будет задана ​​этой функцией во время выполнения.

error_reporting(0);

Для удаления всех ошибок, предупреждений, сообщений и уведомлений передайте в функцию error_reporting ноль. Можно сразу отключить сообщения отчетов в ini-файле PHP или в .htaccess:

error_reporting(E_NOTICE);

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

Иногда это также происходит потому, что объявленная переменная имеет другое написание, чем переменная, используемая для условий или циклов. Когда E_NOTICE передается в функцию error_reporting, эти необъявленные переменные будут отображаться.

error_reporting(E_ALL & ~E_NOTICE);

Функция сообщения об ошибках позволяет вам фильтровать, какие ошибки могут отображаться. Символ «~» означает «нет», поэтому параметр ~ E_NOTICE означает не показывать уведомления. Обратите внимание на символы «&» и «|» между возможными параметрами. Символ «&» означает «верно для всех», в то время как символ «|» представляет любой из них, если он истинен. Эти два символа имеют одинаковое значение в условиях PHP OR и AND.

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

Эти три строки кода делают одно и то же, они будут отображать все ошибки PHP. Error_reporting(E_ALL) наиболее широко используется разработчиками для отображения ошибок, потому что он более читабелен и понятен.

Включить ошибки php в файл с помощью функции error_log ()

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

Простой способ использовать файлы журналов — использовать функцию error_log, которая принимает четыре параметра. Единственный обязательный параметр — это первый параметр, который содержит подробную информацию об ошибке или о том, что нужно регистрировать. Тип, назначение и заголовок являются необязательными параметрами.

error_log("There is something wrong!", 0);

Параметр type, если он не определен, будет по умолчанию равен 0, что означает, что эта информация журнала будет добавлена ​​к любому файлу журнала, определенному на веб-сервере.

error_log("Email this error to someone!", 1, "someone@mydomain.com");

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

error_log("Write this error down to a file!", 3, "logs/my-errors.log");

Для записи сообщений в отдельный файл необходимо использовать тип 3. Третий параметр будет служить местоположением файла журнала и должен быть доступен для записи веб-сервером. Расположение файла журнала может быть относительным путем к тому, где этот код вызывается, или абсолютным путем.

Журнал ошибок PHP через конфигурацию веб-сервера

Лучший способ регистрировать ошибки — это определить их в файле конфигурации веб-сервера.

Однако в этом случае вам нужно попросить администратора сервера добавить следующие строки в конфигурацию.

Пример для Apache:

ErrorLog "/var/log/apache2/my-website-error.log"

В nginx директива называется error_log.

error_log /var/log/nginx/my-website-error.log;

Теперь вы знаете, как в PHP включить отображение ошибок. Надеемся, что эта информация была вам полезна.

аватар |

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

В скрипте PHP

1) В PHP есть всего лишь один оператор, который поддерживает систему управления ошибками — это знак @. Он позволяет проигнорировать сообщение любое сообщение об ошибке. Его нужно ставить ПЕРЕД выражением, которое может её содержать.

В примере специально допущена ошибка, но она НЕ будет отображена

$value = @$var[$key];

2) Также можно перед проверяемым скриптом PHP можно вставить настройку параметра отображения ошибок (display_errors). Он может приобретать значение либо On (показывать), либо Off (скрыть).

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

И соответственно после кода, который проверялся на ошибки, выставить параметр обратно.

ini_set('display_errors','Off');

Например, Вы хотите увидеть ошибки в скрипте

ini_set('display_errors', 'On'); // сообщения с ошибками будут показываться
error_reporting(E_ALL); // E_ALL - отображаем ВСЕ ошибки
$value = $var[$key]; // пример ошибки
ini_set('display_errors', 'Off'); // теперь сообщений НЕ будет

Можно выставить наоборот (в верхнем off, а в нижнем on), чтобы в конкретном отрезке кода ошибки НЕ отображались.

В файле .htaccess

Чаще всего проблему решают именно указанием настроек в файле .htaccess, который располагается в корневой директории сайта. В строке php_flag display_errors нужно также выставить On или Off

php_flag display_errors On
#показать все ошибки кроме предупреждений (Notice)
php_value error_reporting "E_ALL & ~E_NOTICE"
Если Вам нужно работать с конкретным типом ошибок, то привожу основные их виды:

E_ALL — все ошибки
E_ERROR — ошибки функций (критические)
E_WARNING — предупреждения
E_PARSE — ошибки синтаксиса
E_NOTICE — замечания (ненормальный код — кодировка и тп)
E_CORE_ERROR — ошибка обработчика
E_CORE_WARNING — предупреждения обработчика
E_COMPILE_ERROR — ошибка компилятора
E_COMPILE_WARNING — предупреждение компилятора
E_USER_ERROR — ошибка пользователей
E_USER_WARNING — предупреждение пользователей
E_USER_NOTICE — уведомления пользователей

В файле php.ini

Как видите, параметр можно указать в нескольких местах. Однако, если у Вы хотите, чтобы целиком на сайте этот параметр имел определённое значение, то проще выставить его в файле php.ini.(к нему на хостинге не всегда может быть доступ), но в этом случае можно будет даже обойти настройки всего хостинга

В php.ini:

error_reporting = E_ALL
display_errors On

В верхней строке выбираем все виды ошибок, в нижней даём добро на их отображение.

После правок необходимо перезапустить Apache, чтобы настройки были изменены и вступили в силу (graceful или restart):

sudo apachectl -k graceful

В каком порядке обрабатывается параметр ошибок

В самом начале учитывается параметр php.ini , затем .htaccess , а после то, что указано непосредственно в скрипте PHP. Так что если что-то не сработало, то смотрим по цепочку выше, возможно, там настройка другая.

Как обычно спасибо за внимание и удачи! Надеюсь статья была полезна!

Предыдущая статья
Пример настройки файла htaccess php Следующая статья
Как подсчитать количество строк в файле PHP?

Похожие статьи

Комментарии к статье (vk.com)

Понравилась статья? Поделить с друзьями:
  • Openproj ошибка при установке
  • Openoffice ошибка при запуске
  • Openoffice jre ошибка
  • Open 4 ошибка чтения файла пакета
  • Opel перечень ошибок