Lambda函数索引

3
我注意到每当我使用 create_function 函数时,一个名为 lambda_N 的函数被赋予了名称。
而如果我刷新页面,N 的值也会增加,如 lambda_2lambda_3 等。
这是不是意味着这些函数会在网页请求之间保留在内存中?如果我创建了 20000 个这样的函数,内存会不会爆炸?

附注:PHP 5.3支持更多真实的lambda表达式。http://php.net/manual/en/functions.anonymous.php - igorw
2个回答

4

为什么刷新页面会增加数字

使用mod_php时,执行器(代表php解释器状态)的生命周期比请求的生命周期长,因为执行器存储在apache进程的内存中。默认情况下,apache进程不会终止,因此它可以在旧请求完成后处理新请求。基本上,每个apache进程都有自己的执行器。

\0lambda_N中的数字N必须对于每个执行器是唯一的,因为这是函数表中的函数名称(也存储在每个执行器中)。数字N是从名为lambda_count的计数器生成的,该计数器存储在_zend_executor_globals结构中。每次调用create_function时,它都会递增。

因此,如果您刷新页面,则请求将由同一进程处理,并且lambda_count似乎每次都会增加(在尝试过程中,我发现通过刷新ctrl-f5或执行其他请求,数字更随机,因此我认为进程更经常地切换)。

函数是否保留在内存中

简短的答案是。显然,在php_request_shutdown回调中清除了函数表(以及其他内容,如操作数组)。就我所见,函数条目仍在哈希中,但函数的操作码已被free(我可能错过了哈希条目被删除的部分)。

因此,执行器的某些成员在多个请求之间共享,但是明智的成员会被清除。

如果您使用fcgi,在其中PHP进程也服务于多个请求,我不确定如何处理函数的生命周期。


2

我可以像使用持久性缓存机制一样使用这些函数吗? - Alex
如果需要缓存,最好使用真正的缓存机制。 - Mariusz Jamro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接