我有一个PHP应用程序,它收到了很多ajax调用。
我注意到当同时发生两个或更多的调用时,它们不会并发执行,第一个需要停止以便第二个执行。
我建立了一个小测试来尝试解决这个问题。我的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';
?>
因此,在开发人员工具(或firebug)控制台上执行$('button').click()后,请求同时发生,但返回答案的时间是最后一个请求2秒后而不是所有四个同时返回(2秒后)。
好吧,我尝试在其他浏览器中同时打开这个文件,并且它成功了,它被并行执行。我的意思是,在chrome上运行这个,然后在firefox中打开页面选项卡显示“测试”需要2秒,而来自chrome ajax请求的响应则在最后一个请求完成2秒后返回,因此其他浏览器请求对第一个调用没有影响(这将证明这是一个会话问题,但见下文)。
如果我为test.php打开多个选项卡,同样的情况也会发生。
我已经尝试将会话更改为memcache-People在其他问题中说,会话可能会锁定。这很有道理,但即使从文件更改到memcache,问题仍然存在(脚本没有会话,session_autostart关闭)。
我真的很关注apache的配置问题,因为第一次过了一段时间后,如果我执行脚本,则会同时执行所有4个ajax调用!我在考虑类似DoS保护之类的东西。
无论如何,任何帮助都将不胜感激!
好的,问题解决了。
最终它是一个会话锁定问题,问题是memcached也锁定了会话!
必须安装php_memcached 2.0.1,该版本在memcached.ini中有一个锁定标志,并使用该版本。问题解决了。
虽然当请求相同的url(在上面的示例中我使用了test.php 4次)时,它仍然一次执行一个。我非常确定这是正确的行为,因为同时多次请求资源没有太多意义。将我的示例更改为请求test1.php,test2.php等等,它就可以正常工作。如果更改查询字符串也可以。
谢谢你的帮助!
PS:不想太早回答自己的问题,所以这里是答案。
$.get("test.php?" + Date.now());
。 - lunixbochs