Ефективний пошук та виправлення багів у PHP

Налагоджувальні засоби

Системные функции

//

  • phpinfo(int $flags = INFO_ALL): bool отправляет в выводной поток информацию о всех параметрах PHP или параметрах выбранного флага, которые содержат информацию о настройках компиляции PHP, о модулях, версии, сервере и среде выполнения, окружении, версии ОС, путях, основных и локальных значениях настроек конфигурации, HTTP-заголовках и лицензии PHP
  • ini_set(string $option, string|int|float|bool|null $value): string|false устанавливает значение заданного параметра конфигурации, которое будет действовать до завершения скрипта, а после завершения вернется к исходному
    • ini_set('log_errors', true) включает логирование ошибкок
    • ini_set('error_log', '/home/reks/domains/reks.biz/logs/php-error-log' ) назначает файл для логирование ошибок
    • ini_set('display_errors', 1) устанавливает вывод ошибок на экран вместе с остальным выводом, применяется только для разработки и отладки
    • и другие... //www.php.net
  • php_sapi_name(): string|false возвращает тип интерфейса (Server API, SAPI), который использует PHP
    • 'cli' указывает на вызов в командной строке консоли
    • неполный список других значений: apache, apache2handler, cgi, cgi-fcgi, cli-server, embed, fpm-fcgi, litespeed, phpdbg

//

//

  • syslog(int $priority, string $message): true записывает строковое сообщение в системный журнал
    • priority комбинация типа и уровня по убыванию:
      • LOG_EMERG система непригодна
      • LOG_ALERT необходимы незамедлительные меры
      • LOG_CRIT критические условия
      • LOG_ERR условия ошибки
      • LOG_WARNING условия предупреждения
      • LOG_NOTICE нормальные, но значительное условие
      • LOG_INFO информационное сообщение
      • LOG_DEBUG сообщение отладки

Функции обработки ошибок

//www.php.net/manual/ru/ref.errorfunc.php

//

  • error_reporting(?int $error_level = null): int устанавливает "уровень" реакции PHP на ошибки;
    • error_level является битовой маской, образованной произвольной битовой суммой из 15ти констант:
      • E_ERROR фатальные ошибки выполнения, неустранимые средствами скрипта, прекратившие его выполнение
      • E_WARNING предупреждения о не фатальных ошибках выполнения, после которых выполнение было продолжено
      • E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE ошибки, предупреждения и уведомления, сгенерированные пользователем средствами функции trigger_error()
      • E_ALL все поддерживаемые ошибки, предупреждения и замечания (полная битовая маска)
      • и другие //www.php.net
  • error_log( string $message, int $type = 0, ?string $destination = null, ?string $extra_headers = null ): bool отправляет строку с сообщением об ошибке message в лог, в почту, в файл или обработчику
    • type тип обработки сообщения:
      • 0 (по умолчанию) отправляет сообщение в системный регистратор (как задано конфигурацией PHP)
      • 1 отправляет сообщение электронной почтой на адрес destination
        • специальные заголовки в сообщение можно добавить в extra_headers
      • 3 записывает сообщение в файл destination
        • не выполняет автоматический переносом строк
      • 4 отправляет сообщение в обработчик логера SAPI
Ошибка 500 (Internal Server Error)

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

В такой ситуации следует создать другой отладочный скрипт и вызвать скрипт с ошибкой из него:

Функции !!!

//

  • set_time_limit(int $seconds): bool задает время в секундах, в течение которого скрипт должен завершить работу, если скрипт не успевает, вызывается фатальная ошибка; по умолчанию даётся 30 секунд, либо время, записанное в настройке max_execution_time в php.ini (если такая настройка установлена).

debug_backtrace

 

debug_backtrace(int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT, int $limit = 0): array выводит стек вызовов функций PHP в массив

  • DEBUG_BACKTRACE_PROVIDE_OBJECT Нужно ли заполнять данные для ключа object
  • DEBUG_BACKTRACE_IGNORE_ARGS Нужно ли исключить аргументы всех функций/методов в ключе "args" для уменьшения расхода памяти

Пример:

Результат вызова - сведения стека вызовов представленные индексированным массивом ассоциативных массивов:

 

//

Leave a Reply