> PHP通常作为DSO(动态共享对象)模块集成到Apache中.
>现在,通常在Linux / Unix下的Apache通常被设置为“预分叉”模型 – 即,当它启动时,一堆子进程被分叉(确切的数字可以通过Apache指令配置),并且它们位于准备好处理请求的“进程池”.
>当请求到达时,内核调度程序从池中选择一个Apache进程(如果可用),并由子进程处理请求.
>基于Apache设置,如果它检测到需要执行PHP脚本,则按照(1)中的设置将其交给PHP DSO.
>因此,在每个请求的基础上不涉及分叉或线程,这是有效的.所有请求上下文都传递给PHP层,PHP层开始编译并执行PHP脚本.注意:如果启用了操作码缓存,则可以绕过编译步骤 – 即,编译PHP脚本上的第一个请求,并缓存其关联的操作码以便为后续请求重用(它是所有子进程共享的全局缓存).由于编译步骤很昂贵(解析脚本等),对于生产系统,最好启用操作码缓存.
>当PHP脚本完成时,它进入清理例程(内置于PHP DSO),它将清理每个请求的内存,关闭所有文件描述,包括db句柄(基于它的打开方式).一些PHP方法具有“持久”句柄(例如,打开数据库连接,文件句柄),这些句柄可以跨请求保存,因此您用于打开特定资源的功能很重要(各自的文档突出显示).默认情况下,大多数资源仅在PHP请求的生命周期中保留,并且在PHP请求完成后会被销毁.关于PHP对象dtors,这一切都取决于创建对象的范围.因此对于全局对象,其dtors将仅在请求周期结束时被调用,而其中一些将在函数返回时超出范围时被调用.因此,您可以免费获得内存/资源管理.您可以通过unset()调用立即触发空闲来控制它.同样从PHP 5.3开始,也可以在请求处理阶段启用垃圾收集 – 请在此处查看更多详细信息:http://www.php.net/manual/en/features.gc.php
>现在,这个Apache子程序(运行PHP脚本)重新进入准备好处理下一个请求的进程池,如步骤3所示.
我上面描述的是Linux / Unix环境中Apache / PHP的典型特征,但我认为类似的情况也适用于Microsoft设置.
同样使用Nginx和FastCGI PHP,我认为同样的循环也适用 – 即在PHP FastCGI模块处理的请求周期结束时清理事物.这也是当Nginx启动时,它将启动由FastCGI PHP模块处理的单独进程池,并且Nginx和FastCGI PHP之间的通信发生在unix套接字中.
希望这可以帮助.