加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 18:03:45 所属栏目:PHP教程 来源:网络整理
导读:我有一个 PHP应用程序,它接收了很多ajax调用. 我注意到,当两个或多个调用同时发生时,它们不会同时执行,第一个必须停止,所以第二个执行. 我已经构建了一个小测试来尝试修复此问题.我有一个像这样的HTML: htmlhead script type="text/javascript" src="https:
我有一个 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()函数之后,不可能(或建议)使用任何会话函数和值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读