Лямбда-индекс функции - PullRequest
       2

Лямбда-индекс функции

3 голосов
/ 16 февраля 2012

Я заметил, что всякий раз, когда я использую create_function, функции присваивается имя, которое выглядит следующим образом:

lambda_N

Что странно, если я обновляю страницу, N увеличиваетсякак lambda_2, lambda_3 и т. д.

Означает ли это, что эти функции остаются в памяти при запросах страниц?Взрывается ли память, если я создаю около 20 000 подобных функций?

Ответы [ 2 ]

4 голосов
/ 16 февраля 2012

Почему число увеличивается, если вы нажмете обновить

При mod_php время жизни исполнителя (который представляет состояние интерпретатора php) больше, чем время жизни запроса, поскольку исполнитель хранится в памяти процесса apache. Процесс apache по умолчанию не завершен, поэтому он может обрабатывать новые запросы после завершения старого. По сути, у каждого процесса Apache есть свой исполнитель.

Число N в \0lambda_N должно быть уникальным для каждого исполнителя, поскольку это имя функции в таблице функций (которая также сохраняется для каждого исполнителя). Число N создается из счетчика с именем lambda_count, хранящегося в структуре _zend_executor_globals. При каждом вызове он увеличивается до create_function.

Таким образом, если вы обновляете страницу, ваш запрос обрабатывается одним и тем же процессом, и lambda_count, кажется, увеличивается каждый раз (во время экспериментов я обнаружил, что при обновлении ctrl-f5 или при выполнении других запросов число будет более случайным поэтому я предполагаю, что процесс переключается чаще).

Функция остается в памяти

Краткий ответ: нет . Очевидно, что таблица функций (среди прочего, таких как массивы op) очищается после каждого запроса в обратном вызове php_request_shutdown. Насколько я вижу, запись функции все еще находится в хэше, но коды операций функций free d (я мог пропустить часть, где удаляются записи хеша).

Таким образом, некоторые члены исполнителя совместно используются несколькими запросами, но разумные из них удалены.

Я не уверен, как обрабатывается время жизни функций, если вы используете fcgi, где процесс PHP также обслуживает более одного запроса.

2 голосов
/ 16 февраля 2012

В основном, да, если вы создадите много лямбда-функций, вам не хватит памяти. Выделенная память никогда не освобождается. Однако есть обходной путь для этого:

http://www.php.net/manual/en/function.create-function.php#98939

...