这只是一个理论问题。
假设我的网站由一个表单组成,该表单使用PHP邮件函数发送电子邮件。我有500个用户同时点击提交。现在需要从PHP发送500个不同会话的电子邮件。
它会并发完成吗?涉及多少个线程?每个发送是否会阻塞其他发送并逐个执行?
有两件事情需要考虑。
第一是你的Web服务器配置。如果你使用Apache,有几个处理模块可以选择。最流行的处理模块是prefork,其中有一个单独的父进程和多个子进程。每个子进程一次只能处理一个请求。这避免了线程完全,因为并非所有的Apache模块都是线程安全的。在生产中,您还可能会发现worker模块。它使用分叉行为和线程来为每个子进程提供多个请求服务。只有当每个Apache模块及其所有依赖项都是线程安全的时才能使用。
第二个需要考虑的是PHP本身。虽然核心PHP语言和一些扩展是线程安全的,但许多扩展不是线程安全的。因此,当您使用Apache和mod_php时,prefork处理模块是最好的选择。(PHP本身没有线程的内部概念。)
tl;dr: Apache + PHP = 每个Apache子进程一个请求。通常您只会有20-30个Apache子进程,这意味着20-30个可能的并发请求。这取决于配置。
sendmail
命令发送的。这立即接受消息并返回。其余的工作由您的MTA(异步)完成,该MTA经过数十年的硬化和优化,可执行此类工作。