在浏览器加载来自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进程仍然挂起,但"backlog“没有那么糟糕,最终这些进程在对服务器产生明显影响之前就消失了。
web服务器的使用率并不高,在任何时候只为半打“访问者”服务。执行5秒AJAX请求的web页面是“受保护的”,这意味着一次只有一个管理员用户可以访问它。
我在PHP MySQLi Singleton for Ajax-Requests end in to many processes上发现了另一个听起来类似的帖子,它提到了AJAX推送引擎(APE)项目,我希望最终能进一步调查这个项目。然而,我现在时间和资源都很紧张(例如,不能设置一个APE服务器...),所以我不知所措,不知道该怎么做。
对于如何在不影响服务器性能的情况下完成5秒AJAX请求,有什么建议吗?为什么使用会话变量会产生如此明显的差异?
发布于 2011-08-17 02:08:16
Apache尝试维护一组空闲的工作进程来处理传入的请求。可以调整这些设置(空闲工作进程的最小数量、工作进程的最大数量-特别感兴趣的MaxRequestsPerChild,尝试降低此值)。这应该不会造成问题-假设你的脚本是正确终止的(这对于典型的web应用程序来说应该不是问题)。你可能会从serverfault community得到一个完整的答案。
此外,根据服务器负载(活跃用户数、应用程序接口使用的资源等),您可能需要扩展您的应用程序(使用亚马逊的ec2服务进行研究自动扩展)。
http://httpd.apache.org/docs/2.0/mod/worker.html
https://stackoverflow.com/questions/7082825
复制相似问题