fil*_*ina 7 php apache ajax concurrency
我有一个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>
Run Code Online (Sandbox Code Playgroud)
test.php包含:
<?php
sleep(2);
echo 'Test';
?>
Run Code Online (Sandbox Code Playgroud)
因此,执行$('button')后,在开发人员工具(或firebug)控制台上单击(),同时发生请求,但在最后一个请求后2秒返回答案,而不是同时返回所有四个( 2秒后).
好吧,我尝试在其他浏览器中打开,同时,这个文件和它工作,它同时执行.我的意思是,在Chrome上运行这个并在firefox中打开页面的选项卡在2秒内显示'Test',而chrome ajax请求的响应在最后一个请求完成后2秒到来,因此其他浏览器请求对第一个请求没有影响一个电话(这将证明这是一个会话问题,但见下文).
如果我为test.php打开多个选项卡,也会发生同样的情况.
我已经尝试将会话更改为memcache - 在其他问题中,人们说会话可能会锁定.这很有道理,但即使从文件更改为memcache之后问题仍然存在(并且脚本没有会话,并且session_autostart已关闭)
我真的是关于apache的配置问题,因为在一段时间后的第一次,如果我执行脚本,它将同时执行所有4个ajax调用!我正在考虑一些DoS保护或类似的东西.
无论如何,任何帮助将不胜感激!
好的,解决了这个问题.
毕竟这是一个会话锁定问题,问题是memcached也会锁定会话!
不得不在memcached.ini中安装具有锁定标志的php_memcached 2.0.1并使用该版本.解决了这个问题.
虽然当请求是针对相同的url时(在上面的例子中我使用了test.php 4次),它仍然一次执行一个.我很确定这是正确的行为,因为同时多次请求资源没有多大意义.改变我的例子来请求test1.php,test2.php等等,它工作得很好.如果更改了查询字符串也可以.
谢谢你的帮助!
PS:这么早就回答我自己的问题没有声誉,所以这就是答案
在我的情况下功能:
session_write_close();
解决了我的问题
我有下一个程序,一个主页调用一个名为ajax.php的 ajax文件.每隔"n"秒调用一次.
并且,我的表单有一个按钮,它返回一个通过ajax调用的报告(**reporte.php**)它只能通过用户的请求(单击)调用,生成结果可能需要一分钟.
大多数情况下,ajax.php运行需要20ms,但如果report.php正在运行,则ajax.php将冻结,直到reporte.php完成任务.最糟糕的是,ajax.php可以叠加.
reporte.php(之前)
<?php
// Some PHP Code goes here.
// The rest of the PHP code (mostly, the slow part of the process).
?>
Run Code Online (Sandbox Code Playgroud)
reporte.php(修复后)
<?php
// Some PHP Code goes here. (ideal if it is the fast part).
session_write_close(); // fix for concurrent ajax
// The rest of the PHP code (mostly, the slow part of the process).
?>
Run Code Online (Sandbox Code Playgroud)
在解决方案之前(Firefox的firebug插件的屏幕截图):

解决方案之后

检查解决方案之前的方法,reporte.php和ajax.php都在加载(并且ajax已经堆叠在几个调用中).在解决方案之后,如果已经加载了每个连续的ajax调用,则reporte.php正在加载.
请注意,在session_write_close()函数之后,不可能(或建议)使用任何会话函数和值.
Mar*_*c B -2
HTTP 请求是相互独立的 - 根据定义,HTTP 协议是无状态的。您执行的每个$.get()操作都是完全独立的新 http 请求,因此您最终会得到 4 个 HTTP 请求、4 个单独的sleep()调用以及来自服务器的 4 个单独的输出。
| 归档时间: |
|
| 查看次数: |
2689 次 |
| 最近记录: |