我安装了AMPPS。
我的Apache服务器无法同时处理多个php请求(例如,如果我多次调用localhost/script.php
,它们将以连续的顺序处理)。script.php
只包含<?php sleep(10); ?>
。
我读到MaxClients指令负责并发访问配置,但在我的httpd.conf
中根本没有它。
禁用Xdebug并将session_write_close();
写入脚本的开头不起作用。
当我将session_start();
添加到文件的开头时,我的代码看起来像这样:
<?php
session_start();
session_write_close();
sleep(10);
phpinfo();
echo "Done";
当向localhost/script.php
发出5个请求时,最后4个请求等待第一个请求结束,然后并发结束。
请帮我解决这个问题。如果缺少帮助我解决此问题所需的任何信息,请通知我,我将添加它。
9条答案
按热度按时间vnjpjtjt1#
Apache可以同时处理多个请求,但在Apache配置中肯定会出现问题。
这取决于您使用的Apache版本以及它的配置方式,但常见的默认配置使用多个工作线程和多个线程来处理并发请求。请参阅http://httpd.apache.org/docs/2.2/mod/worker.html了解其工作原理。
你面对它的原因是:在某个地方有一些锁-这可能发生,例如,如果两个请求来自同一个客户端,并且您正在使用PHP中基于文件的会话:当脚本被执行时,会话被“锁定”,这意味着服务器/客户端将不得不等待直到第一请求完成(并且文件被解锁),以便能够使用该文件为第二用户打开会话。
请求来自同一客户端和同一浏览器;在这种情况下,大多数浏览器将请求排队,即使服务器端没有产生这种行为。
x3naxklr2#
可能是因为会话锁定。当您不需要编辑会话变量时,请关闭它。
http://php.net/manual/en/function.session-write-close.php
t3psigkw3#
操纵你的会话,写在脚本的开始。PHP
rbpvctlc4#
您是否尝试过使用不同的浏览器选项卡/窗口/示例进行同时调用?
Apache是多线程的,因此,它绝对可以处理您的并行请求。看来你有一些东西要检查:
qaxu7uf25#
Apache提供了各种多处理模块(Apache称之为MPM),这些模块规定了如何处理客户端请求。基本上,这允许管理员轻松地交换其连接处理架构。这些措施是:
1.**mpm_prefork:**此处理模块生成一个进程,每个进程有一个线程来处理请求。每个子节点一次可以处理一个连接。
1.**mpm_worker:**该模块生成的进程可以管理多个线程。这些线程中的每一个都可以处理单个连接。由于线程比进程多,这也意味着新连接可以立即使用空闲线程,而不必等待空闲进程。
1.**mpm_event:**该模块在大多数情况下与worker模块类似,但针对处理keep-alive连接进行了优化。当使用工作MPM时,只要连接保持活动,连接将保持线程,而不管是否正在主动发出请求。
5m1hhzi46#
在调用session close之前,尝试在session中包含sleep和phpinfo。因为它看起来像会话(所有五个都被视为相同的,并与第一个被终止的终止)。可以验证会话ID是否相同。通过保持会话打开,您可以看到它们被并发处理。
azpvetkf7#
我也遇到过类似的问题。多个请求在连接到服务器时随机挂起。
已尝试更改mpm配置,但没有用。
最后,这一个似乎解决了我的问题。(来自https://serverfault.com/a/680075)
wz1wpwve8#
Artisan是单线程的!只是不要为您的项目服务与工匠。相反,创建一个路由到你的laravel/public或者你可以使用Laravel Octan,这是非常强大的。
6za6bjd09#
您可以将会话存储从文件移动到数据库-这样您就有可能一次请求所有文件而无需等待-或者-如果脚本中不需要会话,请将其关闭(不要使用
session_start();
)