【问题标题】:Concurrent connections with Apache coming from same client来自同一客户端的与 Apache 的并发连接
【发布时间】:2012-04-23 01:46:23
【问题描述】:


我有一个接收大量 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';
?>

因此,在开发人员工具(或 firebug)控制台上执行 $('button').click() 后,请求同时发生,但在最后一个请求后 2 秒返回答案,而不是全部四个返回同时(2 秒后)。
好吧,我尝试在其他浏览器中打开,同时,这个文件并且它工作,它被同时执行。我的意思是,在 chrome 和 firefox 上运行它,在选项卡中打开页面会在 2 秒内显示“测试”,而来自 chrome ajax 请求的响应会在最后一个请求完成后 2 秒出现,因此其他浏览器请求对第一个没有影响一个电话(这将证明这是一个会话问题,但见下文)。
如果我为 test.php 打开多个选项卡,也会发生同样的情况。

我尝试将会话更改为内存缓存 - 人们在其他问题中说,会话可能被锁定。这很有意义,但即使从文件更改为内存缓存后,问题仍然存在(并且脚本没有会话,并且 session_autostart 已关闭)

我真的很关心 apache 的配置问题,因为在一段时间后的第一次,如果我执行脚本,它将同时执行所有 4 个 ajax 调用!我正在考虑一些 DoS 保护或类似的东西。

无论如何,任何帮助将不胜感激!


好的,问题解决了。

毕竟这是一个会话锁定问题,问题是 memcached 也锁定了会话!
必须安装在 memcached.ini 中具有锁定标志的 php_memcached 2.0.1 并使用该版本。解决了问题。

虽然当请求是针对同一个 url 时(在上面的示例中,我使用了 test.php 4 次)它仍然一次执行一个。我很确定这是正确的行为,因为同时多次请求资源没有多大意义。将我的示例更改为请求 test1.php、test2.php 等,它工作得很好。如果查询字符串发生更改,也可以使用。

感谢您的帮助!

PS:没有这么早回答我自己的问题的声誉,所以这里是答案

【问题讨论】:

  • 尝试将随机数作为查询字符串附加到您的请求中,以确保它不是缓存问题,例如 $.get("test.php?" + Date.now());
  • 您想同时发出所有请求吗?还是您想避免这种情况?
  • 我想同时制作。我注意到测试相同的 url 是错误的。然后我通过 test4.php 测试了 test1.php。问题仍然存在,但我找到了导致它的原因,我会用解决方案来回答。

标签: php ajax apache concurrency


【解决方案1】:

在我的例子中,函数:

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

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

解决后

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

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

【讨论】:

  • 解决了我的问题。注意到不太密集的请求在一秒钟后返回。分析,测试,服务器代码很好。然后注意到这是同时请求。会话关闭修复它
【解决方案2】:

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

【讨论】:

  • 你的回答离题太远了。
猜你喜欢
  • 1970-01-01
  • 2011-01-15
  • 2014-11-15
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
相关资源
最近更新 更多