Я немного запутался в утечке памяти в PHP.
Я читал, что PHP автоматически освобождает память, используемую в каждом запросе, благодаря Zend Memory Manager: http://www.webreference.com/programming/php_mem/2.html
Но я вижу много людей и темы (даже здесь, в SO), связанные с PHP и утечками памяти.
Поэтому я чувствую, что что-то теряю.
Возможно ли иметь утечки памяти в PHP между разными запросами?
Невозможно иметь утечки памяти из скриптов 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 – наиболее подробно описано здесь .