Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP在Apache下是可重入的吗?_Php_Lamp - Fatal编程技术网

PHP在Apache下是可重入的吗?

PHP在Apache下是可重入的吗?,php,lamp,Php,Lamp,只是一个理论问题 假设我的网站由一个使用PHP邮件函数发送电子邮件的表单组成。我有500个用户同时点击提交。现在,必须从PHP发送500个不同会话中的500封电子邮件 会否同时进行?涉及多少线程?每个发送都会阻止其他发送并逐个执行吗?在基于linux的服务器中,电子邮件是使用本地sendmail命令发送的。这会立即接受消息并返回。剩下的工作由MTA(异步)完成,它经过几十年的强化和优化,可以完成像这样的工作。有两件事需要考虑 第一个问题是如何配置web服务器。如果您使用的是Apache,那么可以

只是一个理论问题

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


会否同时进行?涉及多少线程?每个发送都会阻止其他发送并逐个执行吗?

在基于linux的服务器中,电子邮件是使用本地
sendmail
命令发送的。这会立即接受消息并返回。剩下的工作由MTA(异步)完成,它经过几十年的强化和优化,可以完成像这样的工作。

有两件事需要考虑

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

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


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

非常感谢。因此,邮件可能不是一个很好的例子。如果提交触发数据库请求或本地服务器端计算(需要10秒),那么其他操作如何。有些是使用X工作线程并发完成的吗?Apache将模拟运行许多子进程。共配置定义了这些进程的最大数目。每个子进程可以启动更多线程(通常在启动时完成,并且在运行时不创建线程)。-因此,进程暂停几秒钟应该不是问题,但在进行配置时,您应该知道这一点。因此,当我编写无线程PHP代码时,我可以假设操作将按照Apache上的配置并发完成?我用“单用户”编码?是的,只要在需要的地方使用锁(通常会使线程暂停),就应该以单用户为中心编写php代码。(您不需要在VB中执行类似于
DoEvents
的操作。)