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