【问题标题】:Is PHP under Apache reentrant?Apache下的PHP是可重入的吗?
【发布时间】:2011-07-11 08:30:21
【问题描述】:

真的只是一个理论问题。

假设我的网站包含一个使用 PHP 邮件功能发送电子邮件的表单。我有 500 个用户同时点击提交。现在必须从 PHP 发送 500 个不同会话中的 500 封电子邮件。

会同时进行吗?涉及多少线程?每个发送都会阻止其他发送并一个接一个地做吗?

【问题讨论】:

    标签: php lamp


    【解决方案1】:

    您需要考虑两件事。

    首先是您如何配置 Web 服务器。如果您使用的是 Apache,可以从中挑选一些 processing modules。最流行的处理模块是prefork,其中有一个父进程和多个子进程。每个孩子一次处理一个请求。这完全避免了线程化,因为并非所有 Apache 模块都是线程安全的。您可能还会在生产中的某处找到 worker 模块。它使用分叉行为和线程的组合来为每个孩子提供多个请求。它只能在每个 Apache 模块及其所有依赖项都是线程安全的情况下使用。

    要考虑的第二件事是 PHP 本身。虽然核心 PHP 语言和一些扩展是线程安全的,但许多扩展不是线程安全的。因此,当您使用 Apache 和 mod_php 时,prefork 处理模块是您的最佳选择。 (PHP 本身没有线程的内部概念。)

    tl;dr: Apache + PHP = 每个 Apache 子节点一个请求。通常只有 20-30 个 Apache 子节点,这意味着 20-30 个可能的并发请求。这取决于配置。

    【讨论】:

      【解决方案2】:

      在基于 linux 的服务器中,使用本地 sendmail 命令发送电子邮件。这立即接受消息并返回。其余工作由您的 MTA(异步)完成,经过数十年的强化和优化,可用于此类工作。

      【讨论】:

      • 非常感谢。所以也许邮件不是一个很好的例子。如果提交触发数据库请求或需要 10 秒的本地服务器端计算,那么其他操作如何。有些会使用 X 工作线程同时完成吗?
      • Apache 将会有许多子进程在运行。这些过程的最大数量由配置定义。每个子进程可以启动更多线程(通常在启动时完成,运行时不创建线程)。 - 因此,进程暂停几秒钟应该不是问题,但是在进行配置时应该注意这一点。
      • 所以当我编写无线程 PHP 代码时,我可以假设操作将按照 Apache 上的配置同时完成?我在编码时考虑到了“单一用户”?
      • 是的,只要您在需要的地方使用锁(这通常会使线程暂停),您就应该以单个用户为重点来编写您的 php 代码。 (你不需要在 VB 中做任何类似DoEvents 的事情。)
      猜你喜欢
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 2022-01-03
      • 2011-04-21
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多