使用会话变量时,Ajax请求之后会有数百个Apache进程挂起

时间:2011-08-16 18:04:31

标签: php ajax apache

浏览器加载来自Apache服务器的PHP网页后,客户端javascript每5秒向PHP更新脚本发送一次AJAX请求。用JSON编码的AJAX响应可能非常大,所以我想简单地发送空数组'[]',如果自上一个AJAX请求以来没有变化,或者整个数组包含各种JSON对象,如果有的话自上次AJAX请求以来发生了变化。

要实现发送'[]'或完整数组,我正在使用会话变量。我的更新脚本如下所示:

<?php
session_start();
$output = '[]'; // server is running PHP 5.1 so can't use built in JSON encode
// code here queries a database and updates $output based on the query result
if (isset($_SESSION['previous_output'])) {
    if ($_SESSION['previous_output'] == $output) {
        echo '[]';
    } else {
        $_SESSION['previous_output'] = $output;
        echo $output;
    }
}
?>

在实现上述脚本之后,Web服务器管理员发现“太多”的httpd进程被创建并闲置,最终导致服务器暂停。

当我删除涉及会话变量的代码时,一些httpd进程仍然存在,但“backlog”并没有那么糟糕,并且最终在对服务器产生明显影响之前进程消失。

Web服务器使用频率不高,可能随时为6个“访问者”提供服务。执行5秒AJAX请求的网页是“受保护的”,这意味着一次只有一个管理员用户可以访问它。

我发现PHP MySQLi Singleton for Ajax-Requests end in to many processes的另一个帖子听起来很相似,它指的是AJAX Push Engine(APE)项目,我想最终进一步调查。但是,我目前正在按时间和资源(例如无法设置APE服务器......),所以我很遗憾可以做些什么。

有关如何执行5秒AJAX请求而不会对服务器性能产生负面影响的任何建议?为什么使用会话变量会产生如此显着的差异?

1 个答案:

答案 0 :(得分:2)

Apache尝试维护一组空闲工作程序来处理传入的请求。可以调整这些设置(最小闲置工人数,最大工人数 - 特别感兴趣的MaxRequestsPerChild,尝试降低此值)。这不应该导致问题 - 假设您的脚本正确终止(这不应该是典型的Web应用程序的问题)。您可以从serverfault community获得全面的答案。

此外,根据服务器负载(活动用户数,API使用的资源等),您可能需要扩展应用程序(使用amazon的ec2服务进行自动扩展研究)。

http://httpd.apache.org/docs/2.0/mod/worker.html