Управление памятью внутри PHP/FI - сложная вещь. Так как пакет может выполняться как модуль сервера, мы должны быть очень осторожны относительно ресурсов памяти. Программа должна быть не только реентерабельной, но также нужно учитывать тот факт, что мы можем получить в любое время сигнал по тайм-ауту, по которому управление выбывает из модуля. Мы не получим никакого предупреждения, и не будет времени, чтобы освободить память, которая может быть распределена. И эта память должна быть освобождена, или область данных процесса httpd, с которым мы связаны, может расти неопределенно. Это также применимо, когда PHP выполняется в режиме CGI, так как это может быть установлено, чтобы выполниться как постоянный процесс FastCGI .
Решение состоит в том, чтобы использовать подпулы памяти. Эти пулы автоматически очищаются Apache, по завершению сеанса, или в случае FastCGI, эти пулы очищаются в main.c, каждый раз, когда выполняется цикл оболочки FastCGI. В настоящий момент используются три таких пула. Они пронумерованы 0,1 и 2. Номер подпула является первым аргументом для функций emalloc и estrdup.
Использование подпулов полностью устраняет потребность явно освобождать память где-либо в программе, с одним исключением - памятью распределенной, с использованием регулярного вызова malloc различными библиотеками, которые могут быть слинкованы в PHP. Библиотека gdbm - один из таких примеров.
[Назад] [Содержание]