Apache不支持多线程?

5
我在本地主机上使用Apache Lounge已经有3个月了。 今天我发现我的Apache/PHP安装不支持多线程,因为我运行了一个使用sleep(10)的脚本,并同时打开了两个浏览器标签(第二个标签在第一个标签完成后加载了10秒)。
我安装了Apache(apache.org版本),但没有任何改变。 我正在使用PHP 5.3.6 VC9线程安全版本。
问题出在哪里?

2
这是一个相当有缺陷的测试。在典型的基于PHP会话的网站中,您只需等待会话文件被先前脚本释放即可。这并不代表Apache内部的情况。 - Álvaro González
当然,Apache HTTP是多线程的,但PHP的某些方面可能不是。 - user207421
3个回答

0

你必须确保使用的是Apache的worker MPM,而不是prefork。根据你的安装情况,你可以简单地将/usr/sbin/httpd2符号链接到/usr/sbin/httpd2-worker(或者它安装在哪里)。

当然,在你的情况下,你也可以在配置文件中增加最大进程数,这样就可以打开多个选项卡并同时运行它们。

类似于这样:

StartServers       2
MinSpareServers    2
MaxSpareServers    8
ServerLimit        8
MaxClients         8
KeepAlive off

谢谢Gabriel,我在提问之前已经更改了这个设置,但是没有任何变化。我该如何切换到MPM? - Ahmad
如果您成功增加了Apache进程的最大数量,那么应该已经解决了您的问题,更改为多线程MPM甚至不会有任何区别。您能发布相关的Apache配置吗? - Gabriel Ross
另一个可能性是您正在使用具有myisam表的MySql,当一个查询在表上运行时,整个表都会被锁定,以便需要访问该表的其他进程/线程必须等待。切换到MySql中的innodb表应该可以解决这个问题。 - Gabriel Ross
从日志来看,似乎服务器已经是多线程的了,所以那就不是问题所在。 - Gabriel Ross
嗨,我现在也遇到了同样的问题。你解决了吗?我也快疯了,它总是等待当前响应,然后执行另一个。谢谢。 - Cihad Turhan
显示剩余2条评论

0

我曾经遇到同样的问题。我从 Chrome 的 3 个浏览器选项卡中向一个本地脚本发送请求,并使用 sleep(4),结果响应相互等待。但是我进行了检查,当我从 Chrome 发送一个请求,再从 Firefox 发送第二个请求时,就不会出现这种情况。


0

看起来你遇到了一个浏览器特性: 只有当你切换到该标签时,后台标签才会被加载;这是许多浏览器的默认设置(检查你的设置或使用两个不同的浏览器进行检查)。 祝好:-)


他说第二个选项卡会在第一个选项卡加载后10秒钟才加载,所以可能不是这个原因。 - Mark Fisher

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