php – 来自Apache的并发连接来自同一客户端

前端之家收集整理的这篇文章主要介绍了php – 来自Apache的并发连接来自同一客户端前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个 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';
?>

因此,执行$(‘button’)后,在开发人员工具(或firebug)控制台上单击(),同时发生请求,但在最后一个请求后2秒返回答案,而不是同时返回所有四个( 2秒后).
好吧,我尝试在其他浏览器中打开,同时,这个文件和它工作,它同时执行.我的意思是,在chrome上运行这个并在firefox中打开页面的选项卡在2秒内显示’Test’,而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:这么早就回答我自己的问题没有声誉,所以这就是答案

在我的情况下功能

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).
?>

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).
?>

解决方案之前(Firefox的firebug插件的屏幕截图):

解决方案之后

解决方案之前检查一下,reporte.PHP和ajax.PHP是否仍在加载(并且ajax已经堆叠在几个调用中).在解决方案之后,如果已经加载了每个连续的ajax调用,则reporte.PHP正在加载.

请注意,在session_write_close()函数之后,不可能(或建议)使用任何会话函数和值.

原文链接:https://www.f2er.com/php/134411.html

猜你在找的PHP相关文章