PHP在Apache下是可重入的吗?

5

这只是一个理论问题。

假设我的网站由一个表单组成,该表单使用PHP邮件函数发送电子邮件。我有500个用户同时点击提交。现在需要从PHP发送500个不同会话的电子邮件。

它会并发完成吗?涉及多少个线程?每个发送是否会阻塞其他发送并逐个执行?

2个回答

4

有两件事情需要考虑。

第一是你的Web服务器配置。如果你使用Apache,有几个处理模块可以选择。最流行的处理模块是prefork,其中有一个单独的父进程和多个子进程。每个子进程一次只能处理一个请求。这避免了线程完全,因为并非所有的Apache模块都是线程安全的。在生产中,您还可能会发现worker模块。它使用分叉行为和线程来为每个子进程提供多个请求服务。只有当每个Apache模块及其所有依赖项都是线程安全的时才能使用。

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

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


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

非常感谢。也许邮件不是一个好的例子。那其他操作呢?比如,如果提交触发了数据库请求,或者本地服务器端计算需要10秒钟。会使用X个工作线程并发执行吗? - JasonGenX
Apache会同时运行许多子进程。这些进程的最大数量由配置定义。每个子进程可以启动更多的线程(通常在启动时完成,不会在运行时创建)。- 因此,如果进程暂停几秒钟,这不应该成为问题,但在配置时应该注意这一点。 - vbence
那么,当我编写无线程 PHP 代码时,我可以假设操作将根据 Apache 上的配置并发执行吗?我以“单用户”为思路编码? - JasonGenX
是的,只要您在需要的地方使用锁(通常可以使线程暂停),您应该将编写PHP代码的重点放在单个用户上。(您不需要像VB中的“DoEvents”那样做任何事情。) - vbence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接