У меня есть обработчик запросов, запущенный в apache / mod_php, который иногда расширяется за пределы максимально допустимого использования памяти (т. Е. Определение memory_limit в php.ini).
Обработка этого запроса вызывает proc_open () для запуска внешних команд. Используется ли использование памяти этими командами «против» использования памяти запросов?
Помимо этого, каковы предпочтительные способы анализа и исправления использования памяти скриптов, работающих под mod_php? Вся информация, которую я обнаружил в области использования памяти php, выглядит следующим образом:
Очевидно, что любой из них может отрицательно повлиять на производительность и стабильность. Как я могу анализировать и исправлять проблему, а не помогать ей?
Apache регистрирует ошибку как:
PHP Неустранимая ошибка: Допустимый размер памяти X байт исчерпан (попытался выделить Y байтов) в foo.php в строке Z
Я задал аналогичный вопрос по управлению памятью PHP: Диагностика утечек памяти – Допустимый размер памяти из # байта исчерпан
Я вполне уверен, что запуск внешних программ от exec () или proc_open () НЕ учитывает ограничение памяти php.
Отслеживание использования памяти в PHP, по-видимому, очень сложно. Кажется, что нет способа поиска таблицы символов или чего-либо подобного.
PHP имеет пару функций управления памятью, таких как memory_get_usage()
и memory_get_peak_usage()
, которые могут извлекать общий объем памяти, используемый в любой заданной точке вашего скрипта. Вы можете написать свой собственный сценарий отслеживания и разместить его в режиме ad hoc в ключевых точках, чтобы найти хоггеров памяти.
В зависимости от того, насколько велик ваш код-стек, трассировка выполнения xdebug может быть вашим лучшим выбором. Но это может быть излишним, если у вас много кода.