Невозможно иметь утечки памяти из сценариев PHP между различными запросами (при использовании конфигурации Apache по умолчанию), поскольку переменные и код, используемые в одном запросе, освобождаются в конце этого запроса, и распределитель памяти PHP запускается заново для следующий запрос. Однако ошибки в интерпретаторе или расширениях PHP могут привести к утечке памяти отдельно.
Гораздо большая проблема состоит в том, что дочерние процессы Apache имеют внутри себя пространство памяти PHP. Они набухают, чтобы выделить пиковое использование памяти скриптом PHP, а затем поддерживают это выделение памяти до тех пор, пока дочерний процесс не будет уничтожен (как только процесс попросит ядро выделить часть памяти, эта память не будет освобождена до тех пор, пока процесс не умрет ). Для более подробного объяснения, почему это проблема и как с ней бороться, см. Мой ответ на Ошибка сервера .
Утечки памяти в скрипте, где переменные не сбрасываются, а сборщик мусора PHP дает сбой, очень редки - большинство скриптов PHP работают в течение нескольких сотен миллисекунд, и этого, как правило, недостаточно для проявления даже серьезной утечки памяти .
Вы можете отслеживать, сколько памяти использует ваш PHP-скрипт, с помощью memory_get_usage()
и memory_get_peak_usage()
- также есть хорошее объяснение использования памяти и защитного программирования в Руководство по PHP .
Управление памятью в PHP подробно объясняется в этой статье .
edit: Вы можете определить скомпилированные модули в Apache с httpd -l
- значения по умолчанию зависят от дистрибутива ОС и конфигурации репозитория. Существует множество способов взаимодействия PHP с Apache - подробнее здесь .