【发布时间】:2014-02-24 10:13:14
【问题描述】:
我想对于知道 Apache 服务器如何工作的人来说几个简单的问题。
向 .php 文件发送 AJAX .send 请求是否会在后台启动新进程?
如果是,该过程何时结束?
当我向同一个 php 文件发送多个 AJAX 请求时,服务器是否会为同一个文件创建多个进程,或者有没有办法将所有请求发送到其中包含无限循环的单个 PHP 进程?
【问题讨论】:
我想对于知道 Apache 服务器如何工作的人来说几个简单的问题。
向 .php 文件发送 AJAX .send 请求是否会在后台启动新进程?
如果是,该过程何时结束?
当我向同一个 php 文件发送多个 AJAX 请求时,服务器是否会为同一个文件创建多个进程,或者有没有办法将所有请求发送到其中包含无限循环的单个 PHP 进程?
【问题讨论】:
ajax 请求与来自网络服务器端的任何其他请求没有区别。区别在于客户端,浏览器将如何处理请求。
对同一个php脚本的多个请求,就像对不同php脚本的多个请求一样处理,服务器会分别同时处理。
如果您使用排他锁,或者您使用文件会话并且仅用于同一会话中的请求,则请求将被逐一处理(当您启动文件会话时,会话被排他锁定,并在请求时自动解锁结束)。
当请求的过程完成时,在执行过程中创建的所有变量都将被销毁。如果您需要在不同请求中保持持久性,您可以使用操作码缓存机制,例如 php-apc
有没有办法将所有请求发送到单个 PHP 进程 里面有无限循环吗?
为什么需要这个?
【讨论】:
Apache 按照以下原则处理请求:
Apache 留下一些空闲进程/线程来处理客户端请求。来自客户端的传入连接由空闲进程处理。如果没有空闲进程,除非达到最大进程数,否则 apache 会启动一个新进程。在这种情况下,您的请求正在等待其他进程完成其工作。
当有太多空闲进程或进程已经处理了最大数量的请求时,进程/线程结束。
Ajax 请求由 PHP 脚本一次处理一个。对于每个 ajax 请求,您的脚本都会从头开始运行。您可以让“长时间运行”的 PHP 脚本持续读取输入并发送输出,但它会阻塞服务器资源并在多个级别上受到超时的影响。一般来说,在像 apache 这样的重型服务器上使用并不是一个好主意,对于繁忙的站点则更少。 如果您需要持续的浏览器-服务器通信,那么带有适当服务器的 HTML5 websockets 提供了一个很好的解决方案,请参见例如。 http://socket.io
【讨论】: