【发布时间】:2011-07-11 08:30:21
【问题描述】:
真的只是一个理论问题。
假设我的网站包含一个使用 PHP 邮件功能发送电子邮件的表单。我有 500 个用户同时点击提交。现在必须从 PHP 发送 500 个不同会话中的 500 封电子邮件。
会同时进行吗?涉及多少线程?每个发送都会阻止其他发送并一个接一个地做吗?
【问题讨论】:
真的只是一个理论问题。
假设我的网站包含一个使用 PHP 邮件功能发送电子邮件的表单。我有 500 个用户同时点击提交。现在必须从 PHP 发送 500 个不同会话中的 500 封电子邮件。
会同时进行吗?涉及多少线程?每个发送都会阻止其他发送并一个接一个地做吗?
【问题讨论】:
您需要考虑两件事。
首先是您如何配置 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 个可能的并发请求。这取决于配置。
【讨论】:
在基于 linux 的服务器中,使用本地 sendmail 命令发送电子邮件。这立即接受消息并返回。其余工作由您的 MTA(异步)完成,经过数十年的强化和优化,可用于此类工作。
【讨论】:
DoEvents 的事情。)