Всегда ли в конце освобождается память, выделенная PHP в одном запросе? - PullRequest
5 голосов
/ 17 сентября 2011

Я немного озадачен утечками памяти в PHP.

Я читал, что PHP автоматически освобождает память, используемую в каждом запросе благодаря Zend Memory Manager: http://www.webreference.com/programming/php_mem/2.html

Но я вижу много людей и тем (даже здесь, в SO), озабоченных PHP и утечками памяти.

Так что я чувствую, что что-то теряю.Возможно ли иметь утечки памяти в PHP между разными запросами?

1 Ответ

8 голосов
/ 17 сентября 2011

Невозможно иметь утечки памяти из сценариев 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 - подробнее здесь .

...