【问题标题】:Simultaneous connections to single browser through PHP and Apache2通过 PHP 和 Apache2 同时连接到单个浏览器
【发布时间】:2012-09-07 05:17:10
【问题描述】:

我现在有一个 AJAX 请求发送到 sendMail.php,它立即关闭连接(使用标题 Connection: Close)并继续处理大约 30 秒。

但我现在遇到的问题是,当同一个客户端尝试从该服务器加载任何 PHP 页面时,它必须等到 sendMail.php 完成处理。

有没有办法解决这个问题?

我正在阅读其他一些可能与会话相关的 SO 问题,但我没有使用任何会话,我什至尝试在 sendMail.php 脚本的开头调用 session_write_close() .

示例代码(这是 hacky 并且完成了,但它有效):

   //File: SendMail.php
   //error_reporting(E_ALL);
    error_reporting(0);
    session_write_close();
    set_time_limit(0); 
    ignore_user_abort(1);
    ignore_user_abort(true);
    ini_set('ignore_user_abort','1');
    apache_setenv('no-gzip', 1);
    apache_setenv('KeepAlive',0);
    ini_set('zlib.output_compression', 0);
    ini_set('output_buffering', 0);

    $size = ob_get_length();

    // send headers to tell the browser to close the connection
    header("Content-Length: $size");
    header('Connection: Close');
        // flush all output
    ignore_user_abort(true);
    ob_end_flush();
    ob_flush();
    flush();
    sleep(30);//The real code has more stuff, but just for example lets just say it sleeps for 30 seconds

其余参考资料是通过 GET 进行的正常导航。

【问题讨论】:

  • 你能提供一些示例代码吗?
  • AJAX 是异步的(这就是第一个 A 的含义),因此它不应阻止浏览器的其他活动。
  • AJAX 成功完成(响应码 4,http 200 ok)。由于与浏览器的连接被强制关闭,PHP 脚本会继续,但来自该浏览器的其他传入响应(即导航到下一页)会延迟,直到第一个 PHP 脚本(sendMail.php)停止。问题是该特定脚本需要很长时间,并且我使用 AJAX 和强制关闭 HTTP 来绕过它,但是 PHP 会停止对该用户的处理,直到初始 AJAX 请求实际完成
  • “Connection: close”标头不会导致连接关闭。它只是告诉浏览器不要尝试将连接重用于其他请求。 PHP 对连接本身没有任何控制权,它由 Web 服务器处理;它在脚本退出时关闭连接。不过,我无法解释为什么一个长时间运行的 PHP 进程会延迟与服务器的新连接。您可以使用数据包嗅探器查看浏览器是否尝试使用相同的连接而不是新连接?
  • 我该如何测试呢?此外,查看标头 Keep-Alive 已打开。这是否会导致它试图重新获得该连接时出现问题?

标签: php performance apache session


【解决方案1】:

听起来您的 AJAX 调用几乎是在调用一个脚本,该脚本正在消耗服务器上的可用资源(无论是内存/CPU/磁盘 I/O/等),并且阻止任何新脚本能够跑步。仔细检查以确保您分配了足够的资源来完成工作。

附带说明一下,通常您不允许您的日常用户生成在服务器上运行那么长时间的进程,这仅仅是因为您为他们打开了使您的系统超载的机会并为他们提供了一个轻松的机会DDOS 攻击。如果可能的话,我会考虑 Ibere 将其移至 cron 的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-13
    • 2017-02-27
    • 2011-10-07
    • 1970-01-01
    • 2019-06-19
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多