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