7


我有一个接收大量 ajax 调用的 PHP 应用程序。
我注意到,当两个或多个调用同时发生时,它们没有同时执行,第一个调用必须停止,以便第二个调用执行。
我已经建立了一个小测试来尝试解决这个问题。我有一个这样的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').click() 后,请求同时发生,但在最后一个请求后 2 秒返回答案,而不是所有四个同时返回( 2 秒后)。
好吧,我尝试在其他浏览器中打开,同时,这个文件并且它工作,它同时执行。我的意思是,在 chrome 和 firefox 上运行它,在选项卡中打开页面会在 2 秒内显示“测试”,而来自 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:没有这么早回答我自己的问题的声誉所以这里是答案

4

2 回答 2

7

在我的情况下,功能:

session_write_close();

解决了我的问题

我有下一个程序,一个经常调用一个名为ajax.php的 ajax 文件的主页。每“n”秒调用一次。

而且,我的表单有一个按钮,它返回一个通过 ajax 调用的报告(** reporte.php**)它仅由用户请求(单击)调用,生成结果可能需要一分钟。

大多数时候,ajax.php 需要 20 毫秒才能运行,但如果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).
?>

解决方案之前(火狐的firebug插件截图): 前

解决后 后

检查在解决方案之前,reporte.php 和 ajax.php 是否仍在加载(并且 ajax 已在多个调用中堆叠)。以及如何在解决方案之后,reporte.php 正在加载,而每个连续的 ajax 调用都已经加载。

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

于 2012-12-13T20:42:26.447 回答
-2

HTTP 请求是相互独立的——根据定义,HTTP 协议是无状态的。您执行的每个$.get()操作都是一个完全独立的新 http 请求,因此您最终会收到 4 个 HTTP 请求、4 个独立sleep()的调用和 4 个来自服务器的独立输出。

于 2012-04-10T19:01:40.313 回答