PHP脚本什么时候结束?

all*_*ode 2 php

在我看来,一个连续运行的Web应用程序; 因此,我对谈论PHP脚本(例如这个)的"结束"的文档页面感到困惑.这样的引用似乎是指每个Web请求的结束,但是如果脚本在那里结束,那是不是意味着操作系统必须为每个请求设置一个全新的进程?这似乎不太可能,因为启动一个全新的流程是昂贵的,并且整个站点的效率非常低.

zne*_*eak 6

这里有一个区别:PHP不是Web服务器.因此,PHP脚本的结尾与Web服务器的实际结束无关(或者至少在大多数情况下).

连续运行的Web服务器软件,如IIS,Apache或Lighttpd,可以执行PHP脚本而不会自行结束.这些脚本,到了最后,停止运行.Web服务器如何为脚本设置执行环境取决于所采用的方法.例如,Apache 2确实可以为每个Web请求生成子进程,尽管每次都不会再次设置整个Web服务器:有一个主进程可以命令子进程执行设置和参数.

因此,当Web请求结束时,PHP脚本结束; 也就是说,当脚本到达使其停止的语句(如致命错误,exit语句等)或者到达脚本源的实际结束时.


编辑关于为新请求生成新流程的效率.

如今,服务器不会为PHP本身生成一个单独的进程:它们使用PHP库来嵌入语言并使用它.但是,服务器确实可以自由地为它们收到的每个HTTP请求生成一个进程.Apache用它的mpm_prefork模块做到了.

虽然产生一个新的过程确实很昂贵,但与脚本本身的成本相比,它可能没什么用,它可以持续十分之几秒,这远远不仅仅是产生一个过程.

此外,服务器通常必须同时为许多客户服务; 因此,按顺序处理每个请求是不可想象的.它们必须同时运行,这使实现者有两个选择:线程或进程.PHP在许多平台上都不是线程安全的,通常最好在单独的进程中运行它.