php - 使用 session 变量时,Ajax 请求后数百个 Apache 进程挂起

标签 php ajax apache

浏览器加载来自 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 服务的自动扩展)。

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

关于php - 使用 session 变量时,Ajax 请求后数百个 Apache 进程挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7082825/

相关文章:

apache - 如何将 Angular 4 应用程序部署到 apache htdocs?

php - 当发件人不止一个时,用于 Paypal 自适应付款的 Paypal 退款 api?

html - ajax调用后jQuery点击功能不起作用?

javascript - 抓取 AJAX - 在 Python 中加载网站,我应该使用哪个 url

jquery - 如何删除警告 "can' t 对未安装的组件执行 react 状态更新”

apache - 链接到其他容器的Docker容器内的Apache HTTP ProxyPass:链接的容器解释了错误的远程IP

java - import org.apache.poi.xssf 无法解析

php - php 命名空间中的 SoapClient 类映射 - 找不到soapfault 类

php - 结合营业时间相似的日子

php - MYSQL 跨表更新不工作