我有一个接收大量 ajax 调用的 PHP 应用程序。
我注意到,当两个或多个调用同时发生时,它们没有同时执行,第一个调用必须停止,以便第二个调用执行。
我已经建立了一个小测试来尝试解决这个问题。我有一个这样的html:
<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</head>
<body>
<a href="test.php">Test</a>
<button>Click</button>
<button>Click</button>
<button>Click</button>
<button>Click</button>
<script type="text/javascript">
$('button').click(function() {
$.get("test.php");
});
</script>
</body>
</html>
test.php 包含:
<?php
sleep(2);
echo 'Test';
?>
因此,在开发人员工具(或萤火虫)控制台上执行 $('button').click() 后,请求同时发生,但在最后一个请求后 2 秒返回答案,而不是所有四个同时返回( 2 秒后)。
好吧,我尝试在其他浏览器中打开,同时,这个文件并且它工作,它同时执行。我的意思是,在 chrome 和 firefox 上运行它,在选项卡中打开页面会在 2 秒内显示“测试”,而来自 chrome ajax 请求的响应在最后一个请求完成后 2 秒出现,因此其他浏览器请求对第一个没有影响一个电话(这将证明这是一个会话问题,但见下文)。
如果我为 test.php 打开多个选项卡,也会发生同样的情况。
我尝试将会话更改为内存缓存 - 人们在其他问题中说,会话可能被锁定。这很有意义,但是即使从文件更改为 memcache 后问题仍然存在(并且脚本没有会话,并且 session_autostart 已关闭)
我真的很关心 apache 的配置问题,因为在一段时间后的第一次,如果我执行脚本,它将同时执行所有 4 个 ajax 调用!我正在考虑一些 DoS 保护或类似的东西。
无论如何,任何帮助将不胜感激!
好的,解决了问题。
毕竟这是一个会话锁定问题,问题是 memcached 也锁定了会话!
必须安装在 memcached.ini 中具有锁定标志的 php_memcached 2.0.1 并使用该版本。解决了这个问题。
虽然当请求是针对同一个 url 时(在上面的示例中,我使用了 test.php 4 次),但它仍然一次执行一个。我很确定这是正确的行为,因为同时多次请求资源没有多大意义。将我的示例更改为请求 test1.php、test2.php 等,它工作得很好。如果查询字符串发生更改,也可以使用。
谢谢你的帮助!
PS:没有这么早回答我自己的问题的声誉所以这里是答案