2010-04-20 117 views
2

在我看来,一个网络应用程序不断运行;因此,我对文档页面感到困惑,这些页面谈论PHP脚本的“结尾”(例如this one)。这样的引用似乎指的是每个Web请求的结束,但是如果脚本在那里结束,并不意味着操作系统必须为每个请求设置一个全新的进程?这看起来不太可能,因为旋转一个全新的流程是昂贵的,并且整个网站的效率非常低。PHP脚本何时结束?

+2

是的。服务器比你想象的要快得多。 PHP二进制文件保存在内存中,除非它是一个CGI,然后在每个请求中加载一个完整的php进程。 – 2010-04-20 23:27:41

回答

6

这里有一个区别:PHP不是一个Web服务器。因此,PHP脚本的结尾与Web服务器的实际结束(或至少大部分时间)无关。

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

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


编辑关于产卵的新要求新过程的效率。

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

虽然产生一个新的进程的确是昂贵的,它比脚本本身的成本,这可能要持续10分之,这是很多,不仅仅是产卵过程更加的时候可能什么都没有。

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

+0

与打印类似:您的输出超出了其创建者。 – dawg 2010-04-20 23:17:12

+0

ASP.NET本身也不是一个Web服务器。尽管如此,它仍在不断运行。 – zerkms 2010-04-20 23:17:35

+0

@zerkms:是的,我知道。 – zneak 2010-04-20 23:25:03

3

是的,这是实际发生的事情,每个请求。这是PHP的本质。