【问题标题】:Does sending an AJAX request in Apache start a new process?在 Apache 中发送 AJAX 请求会启动一个新进程吗?
【发布时间】:2014-02-24 10:13:14
【问题描述】:

我想对于知道 Apache 服务器如何工作的人来说几个简单的问题。

  1. 向 .php 文件发送 AJAX .send 请求是否会在后台启动新进程?

  2. 如果是,该过程何时结束?

  3. 当我向同一个 php 文件发送多个 AJAX 请求时,服务器是否会为同一个文件创建多个进程,或者有没有办法将所有请求发送到其中包含无限循环的单个 PHP 进程?

【问题讨论】:

    标签: php ajax


    【解决方案1】:

    ajax 请求与来自网络服务器端的任何其他请求没有区别。区别在于客户端,浏览器将如何处理请求。

    对同一个php脚本的多个请求,就像对不同php脚本的多个请求一样处理,服务器会分别同时处理。

    如果您使用排他锁,或者您使用文件会话并且仅用于同一会话中的请求,则请求将被逐一处理(当您启动文件会话时,会话被排他锁定,并在请求时自动解锁结束)。

    当请求的过程完成时,在执行过程中创建的所有变量都将被销毁。如果您需要在不同请求中保持持久性,您可以使用操作码缓存机制,例如 php-apc

    有没有办法将所有请求发送到单个 PHP 进程 里面有无限循环吗?

    为什么需要这个?

    【讨论】:

    • 基本上我不想在每次单击按钮时重新初始化套接字地址变量,并且我无法使用 AJAX 或 APC 共享变量,因为它是资源变量类型。所以,我想使用 AJAX 将请求从 JavaScript 发送到正在运行的(初始化的)PHP 进程。我解释了我的整个问题here
    【解决方案2】:

    Apache 按照以下原则处理请求:

    1. Apache 留下一些空闲进程/线程来处理客户端请求。来自客户端的传入连接由空闲进程处理。如果没有空闲进程,除非达到最大进程数,否则 apache 会启动一个新进程。在这种情况下,您的请求正在等待其他进程完成其工作。

    2. 当有太多空闲进程或进程已经处理了最大数量的请求时,进程/线程结束。

    3. Ajax 请求由 PHP 脚本一次处理一个。对于每个 ajax 请求,您的脚本都会从头开始运行。您可以让“长时间运行”的 PHP 脚本持续读取输入并发送输出,但它会阻塞服务器资源并在多个级别上受到超时的影响。一般来说,在像 apache 这样的重型服务器上使用并不是一个好主意,对于繁忙的站点则更少。 如果您需要持续的浏览器-服务器通信,那么带有适当服务器的 HTML5 websockets 提供了一个很好的解决方案,请参见例如。 http://socket.io

    【讨论】:

    • 如何在单个 PHP 程序中从 JavaScript 进行多次读取?我的“服务器”不是互联网服务器,一次只能连接 1 个。我将如何设置您提到的“长时间运行”的 PHP 脚本?
    • 应该有一种方法,例如在运行 PHP 脚本中实现 Websockets 服务器,但这对于您的目的来说绝对是个坏主意(而且几乎总是一个坏主意)。在阅读了您的problem 之后 - 打开一个 unix 套接字并在 C 程序端接受它会比在 apache+php 本身内部处理请求要快得多。做一些测试。
    • C 程序是一个socket 服务器,PHP 脚本应该只是连接到C 服务器一次,然后在每个按钮单击/释放时通过socket 发送一条消息。问题是触发 PHP 发送消息,因为 PHP 无法检测到按钮点击(只有 JavaScript 可以)。
    • 当然。我想说的是,与您在 Apache+PHP 中处理 HTTP 请求的成本相比,创建本地套接字非常便宜(性能方面)。
    • 酷,我不知道 :D 所以,如果我理解正确的话,你是说在 JavaScript 中处理按钮单击事件并执行 AJAX 调用比初始化调用PHP脚本中的socket连接?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    相关资源
    最近更新 更多