浏览器加载来自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请求而不会对服务器性能产生负面影响的任何建议?为什么使用会话变量会产生如此显着的差异?
答案 0 :(得分:2)
Apache尝试维护一组空闲工作程序来处理传入的请求。可以调整这些设置(最小闲置工人数,最大工人数 - 特别感兴趣的MaxRequestsPerChild,尝试降低此值)。这不应该导致问题 - 假设您的脚本正确终止(这不应该是典型的Web应用程序的问题)。您可以从serverfault community获得全面的答案。
此外,根据服务器负载(活动用户数,API使用的资源等),您可能需要扩展应用程序(使用amazon的ec2服务进行自动扩展研究)。