当使用会话变量时,Ajax请求后会出现数百个Apache进程


Hundreds of Apache Processes Hanging around after Ajax Requests when Session Variable is Used

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

要实现发送'[]'或整个数组,我使用会话变量。我的更新脚本看起来像:

<?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进程仍然徘徊,但"积压"并没有那么糟糕,最终这些进程在对服务器产生明显影响之前就消失了。

web服务器没有被大量使用,可能在任何时候服务六个"访问者"。做5秒AJAX请求的网页是"受保护的",这意味着一次只有一个管理员用户可以访问它。

我在PHP MySQLi Singleton for AJAX - requests结束于许多听起来类似的过程,它指的是AJAX Push Engine (APE)项目,我想进一步调查最终。然而,我目前的时间和资源都很紧张(例如,无法设置APE服务器…),所以我不知道能做些什么。

关于如何在不影响服务器性能的情况下完成5秒AJAX请求,有什么建议吗?为什么使用会话变量会产生如此明显的差异?

Apache试图维护一组空闲的worker来处理传入的请求。这些设置可以调整(最小空闲工作线程数,最大工作线程数-特别感兴趣的MaxRequestsPerChild,尝试降低此值)。这应该不会导致问题——假设你的脚本正确终止(这对于典型的web应用程序来说不应该是一个问题)。您可能会从serverfault社区得到一个完整的答案。

此外,根据服务器负载(活跃用户数量,api使用的资源等),你可能需要扩展你的应用程序(研究亚马逊的ec2服务的自动扩展)。

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