浏览器加载来自 Apache 服务器的 PHP 网页后,客户端 javascript 每 5 秒向 PHP 更新脚本发送 AJAX 请求。以 JSON 编码的 AJAX 响应可能非常大,所以如果自上次 AJAX 请求以来没有变化,我只想发送空数组“[]”,或者如果有一个包含各种 JSON 对象的整个数组自上次 AJAX 请求以来发生变化。
为了实现发送“[]”或完整数组,我使用了一个 session 变量。我的更新脚本如下所示:
<?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;
}
}
?>
执行上述脚本后,网络服务器管理员注意到“太多”的 httpd 进程被创建并徘徊,最终导致服务器停止运行。
当我删除涉及 session 变量的代码时,一些 httpd 进程仍然存在,但“积压”并没有那么糟糕,最终进程在对服务器产生明显影响之前就消失了。
Web 服务器使用不频繁,随时可能有六个“访问者”。执行 5 秒 AJAX 请求的网页是“ protected ”,这意味着一次只有一个管理员用户可以访问它。
我在 PHP MySQLi Singleton for Ajax-Requests end in to many processes 找到了另一个帖子这听起来很相似,它指的是 AJAX 推送引擎 (APE) 项目,我最终想进一步研究它。但是,我目前时间和资源都很紧迫(例如无法设置 APE 服务器...),所以我不知道可以做什么。
关于如何执行 5 秒 AJAX 请求而不会对服务器性能产生不利影响的任何建议?为什么使用 session 变量会产生如此显着的差异?
最佳答案
Apache 试图维护一组空闲的工作进程来处理传入的请求。可以调整这些设置(空闲 worker 的最小数量, worker 的最大数量 - 特别感兴趣的 MaxRequestsPerChild,尝试降低这个值)。这应该不会导致问题 - 假设您的脚本正确终止(这对于典型的网络应用程序来说应该不是问题)。您可能会从 serverfault community 得到一个彻底的答案.
此外,根据服务器负载(活跃用户数量、api 使用的资源等),您可能需要扩展您的应用(研究亚马逊 ec2 服务的自动扩展)。
关于php - 使用 session 变量时,Ajax 请求后数百个 Apache 进程挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7082825/