在我看来,一个连续运行的网络应用程序;因此,我对谈论PHP脚本“结束”的文档页面感到困惑(例如this one)。这样的引用似乎是指每个Web请求的结束,但是如果脚本在那里结束,那是不是意味着操作系统必须为每个请求设置一个全新的进程?这似乎不太可能,因为启动一个全新的流程是昂贵的,并且整个站点的效率非常低。
答案 0 :(得分: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在许多平台上都不是线程安全的,通常最好在单独的进程中运行它。
答案 1 :(得分:3)
是的,这是实际发生的事情,每个请求。这就是PHP的本质。