Печать PHP, выполняющего стек вызовов из-за пределов PHP

Есть ли какая-либо функция трассировки стека во время работы PHP, с помощью данного PID? (Для кого тоже писать Java, я имею в виду jstack.)

У меня появилось несколько фоновых процессов PHP, которые они иногда замерзают на некоторых неизвестных строках. Я могу просто убить их всех и перезапустить, но это не помешает повторению этого.

Есть ли API, способный шпионить за стеком и рассказывать? как утилита jstack, предоставляемая JDK?

    У вас есть несколько вариантов с точки зрения отладки неизвестных ошибок.

    • Первый метод прост, но требует установки PHP-расширения.
    • Второй метод предлагает более сложный практический подход, но определенно стоит того, если вы находитесь в низкоуровневой внутренней работе интерпретатора PHP. Кроме того, для этого потребуется настроить linux и PHP с помощью функции --enable-debug .
    • Третий и, по моему мнению, самый простой метод не требует использования каких-либо внешних программ или добавленных расширений PHP.

    1. Xdebug

      • Это расширение PHP, которое вы можете установить и иметь для любого сайта / страницы.
      • Быстрый список функций с веб-сайта:
        • Автоматическая трассировка стека при ошибке
        • Регистрация функций
        • Отображать такие функции, как расширенный выход var_dump () и информация о покрытии кода.
      • Если вы видите, что вам нужно много отлаживать ваши сценарии, это может быть лучшим вариантом. Более симпатичное отображение ошибок также является хорошим палец вверх в моей книге.
    2. Используйте gdb для запуска файла, который разбивается и анализирует обратную трассировку.

      • Это промежуточный подход к переходу, который требует, чтобы PHP был настроен с помощью --enable-debug , Linux-машины с Apache и сильным желанием / способностью понять, как программное обеспечение работает на более низком уровне.
      • Запустите gdb с Apache :
        gdb /usr/lib/httpd
      • Тогда у вас есть два варианта:
        • Запустите apache как сервер и загрузите файл через браузер, как обычно:
          (gdb) run -X
          … теперь в вашем браузере – доступ к странице, которая аварийно завершается, и переключиться обратно на gdb : (gdb) backtrace
          … будет распечатана полная обратная трассировка
        • Или используйте gdb для запуска самого скрипта:
          (gdb) run /path/to/the/script.php
          (gdb) backtrace
          … будет распечатана полная обратная трассировка
      • Для получения дополнительной информации о gdb ознакомьтесь с руководством по быстрой ссылке .
    3. Создайте собственный обработчик ошибок, который печатает трассировку стека при ошибке.

      • Чтобы наверняка поймать все ошибки, вы можете уловить ошибки, исключения и события выключения PHP.
      • Для отладки одной страницы это так же просто, как создание функции для обработки ошибки, а затем вставка этой функции в начало страницы, на которой у вас возникают проблемы. Еще один шаг, у меня есть класс обработки ошибок, который находится в отдельном файле и просто включает его в случае необходимости (упрощенный вариант ниже). Вы можете настроить каждый метод в соответствии с потребностями вашего дисплея или даже обрабатывать ошибки на основе числа ошибок.
      • Затем, чтобы использовать это, просто добавьте require('ErrorHandler.php'); в верхней части страницы, и она должна автоматически регистрироваться для обработки любых ошибок. Обязательно обновите include-path, чтобы указать на фактический файл, конечно.

    ErrorHandler.php:

     <?php class ErrorHandler { public static function captureError($err_no, $message, $file, $line) { echo '<strong>Error (#' . $err_no . '):</strong> ' . $message . ' in ' . $file . ' on line #' . $line . '<br />'; debug_print_backtrace(); } public static function captureException($exception) { echo '<pre>' . print_r($exception, true) . '</pre>'; } public static function captureShutdown() { if (($error = error_get_last()) !== null) { debug_print_backtrace(); } } } set_error_handler(array('ErrorHandler', 'captureError')); set_exception_handler(array('ErrorHandler', 'captureException')); register_shutdown_function(array('ErrorHandler', 'captureShutdown')); ?>