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

标签 php ajax apache concurrency


我有一个接收大量 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 秒出现,因此其他浏览器请求对第一个没有影响一个电话(这将证明这是一个 session 问题,但请参阅下文)。
如果我为 test.php 打开多个选项卡,也会发生同样的情况。

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

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

无论如何,我们将不胜感激!


好的,问题解决了。

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

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

感谢您的帮助!

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

最佳答案

在我的例子中函数:

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插件截图): before

解决后 after

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

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

关于php - 来自同一客户端的与 Apache 的并发连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10094348/

相关文章:

linux - apache 没有安装在 linux mint 上

excel - Clojure excel交互(公式)

javascript - Ajax 成功中 Laravel Route 的多个参数

php - 如何使用单列复选框从 HTML 表单更新 MYSQL 表

PHP登录 - 密码输入 - 特殊字符? - Centos 5 系统

javascript - 间歇性 Cloudfront CDN 故障(监控)- CDN 故障转移

javascript - 在同一页面上处理来自 ajax 驱动的 Fancybox 元素的 PHP 请求

php - 如何使用两个数组使用foreach循环来获取结果

javascript - 如何使用 AJAX 请求获取选择列表中的所有值?

php/symfony2 从 URL 中隐藏 app.php