Apache下的PHP是否可以重入?

时间:2011-03-08 18:58:45

标签: php lamp

真的只是一个理论问题。

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

它会同时完成吗?涉及多少线程?每个人会阻止其他人一个接一个地做吗?

2 个答案:

答案 0 :(得分:4)

您需要考虑两件事。

首先是如何配置您的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个可能的并发请求。这取决于配置。

答案 1 :(得分:1)

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

相关问题