PhP 7.4 中的服务器发送事件 SSE - Apache 挂起并且不注册/服务任何新请求

2023-12-05

Context

我正在研究一个PhP服务器发送事件应用程序运行于Ubuntu 20.10 上的 PhP 7.4 和 Apache 2.4。该应用程序执行了它应该执行的操作,但是,据推测,用户数量的增加(连接?SSE 连接?)会导致服务器挂起。我期望/希望能够处理相对大量的用户(~1000),但我的 SSE 事件很少触发(15 分钟内~3 次),并且仅查找并发送在文本文件中找到的一些字符串值在服务器上。

Problem

我的问题是,在某些情况下,包括客户数量增加(~70 到 100)阿帕奇开始挂起。新的 HTTP 请求不会在访问日志中报告,错误日志中不会报告任何错误,并且从浏览器发送的任何请求似乎都会永远加载而没有服务器响应。那一刻的服务器负载(处理器、RAM)最小我可以通过SSH或FTP正常访问服务器。

我尝试过的

默认 Apache 配置会发生这种情况,因此如下在线咨询我试过关闭 mpm_prefork 模块 and 激活 mpm_event 和 php7.4-fpm。除了客户端数量增加了几十之外,没有太大变化,但这也可能不是真的,因为我无法手动测试,只要有机会就对应用程序进行实时测试。

我尝试关闭应用程序中的 SSE 元素,在这种情况下,我没有 Apache 挂起问题(但我无法更新需要 SSE 的客户端信息)。这意味着SSE 可能导致过载/Apache 挂起关于某事,但我不知道是什么。

我认为 Apache 挂起与打开的连接或进程的数量有关。据我所知,我只能控制它/etc/apache2/apache2.conf(我尝试设置最大保持活动请求数 0)并在/etc/php/7.4/fpm/pool.d/www.conf(我尝试设置pm.max_children = 250,pm.start_servers = 10,pm.min_spare_servers = 5,pm.max_spare_servers = 15,pm.max_requests = 1000)但无济于事。

我的问题

  • 我能做什么增加 Apache 支持的连接/SSE 进程数量跑步?
  • 我该怎么做才能找到答案是什么导致 Apache 挂起或者通常是什么原因导致的?
  • 任何其他想法/建议关于如何解决Apache挂掉的问题?

我的服务器端代码是

<?php
header('Content-Type: text/event-stream; charset=utf-8');
header("Cache-Control: no-store");
header('Connection: keep-alive');
header('Content-Encoding: none;');
set_time_limit(0);

while (true) {
    
    if (configurationChanged()) {
        echo "data: " . newConfiguration() . "\n\n";
        ob_end_flush();
        flush();
        
    } else {
        sleep(3);  
    }
    
    if (connection_aborted()) break;
}
?>

我的客户端代码是

var source = new EventSource('myScript.php', {withCredentials: false});
    source.onopen = function (event) {
        console.log("Connection opened.");
    };
    source.onmessage = function(event) {
        console.log(event.data);
        // Do stuff with the obtained data here
    }

感谢您阅读本文。


解决方案

我的主要问题是,当我的服务器上有可用资源时,我没想到 Apache 会挂起。缺乏经验导致我浪费了很多时间才意识到我应该寻找原因

  • Apache错误日志/var/log/apache2/error.log
  • FPM 日志 /var/log/php7.4-fpm.log

I tried 重新配置 mpm-event 模块根据link评论中给出。虽然它有助于增加几十个并发用户的数量,但同样当用户数量进一步增加时,问题就开始出现.

有什么帮助是设置pm = 点播 in /etc/php/7.4/fpm/pool.d/www.conf以避免手动定义参数。我不确定为什么这不是默认值或没有得到更广泛的推荐。我的问题似乎已经解决了。

然而,新的问题开始出现。 FPM日志/var/log/php7.4-fpm.log开始报告2种错误:

  1. [mpm_event:错误] ... AH03490:记分板已满,不在 MaxRequestWorkers.Increase ServerLimit。这会让我的 Web 应用程序对用户来说挂起几分钟,然后在没有任何干预的情况下恢复正常。
  2. [proxy_fcgi:error] ... (70007)指定的超时已过期:... AH01075:将请求分派到:(轮询)时出错,引荐来源:...这会为我的用户终止我的 Web 应用程序(因此,如果 SSE 连接结束,我添加了 JavaScript 来重新加载目标 php 脚本给我的用户)

For 1.我尝试按照错误消息说明“Increase ServerLimit”并将“ServerLimit 250”添加到/etc/apache2/mods-enabled/mpm_event.conf。那并没有解决问题。 我发现这个 Apache 错误报告,但我使用的版本应该已修复。然后我发现这一页建议我应该将 mpm-event 更改为 mpm-worker。非常有效,解决了问题 1。

For 2.问题 2 与我的 PhP SSE 应用程序相关,特别是 SSE 脚本超时。做了什么没有帮助只是简单地添加 set_time_limit(0);到我的 PhP 脚本。根据错误,proxy_fcgi 达到超时,所以我不得不编辑/etc/apache2/apache2.conf并设置 超时3600 代理超时 3600

这将任何脚本的最大执行时间增加到 1 小时(3600 秒)。这不是一个理想的解决方案,但我一直无法找到只允许特定脚本(在我的例子中 SSE PhP 脚本在无限循环中运行)执行时间的解决方案。

希望这对某人有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PhP 7.4 中的服务器发送事件 SSE - Apache 挂起并且不注册/服务任何新请求 的相关文章

  • 纠正装饰器模式的一个大缺点

    不久前 我在重构一些游戏战斗代码时决定尝试装饰器模式 战斗者可以拥有各种被动能力 也可能是不同类型的生物 我认为装饰器可以让我在运行时以各种组合添加行为 因此我不需要数百个子类 我几乎已经完成了 15 个左右的被动能力装饰器 在测试中我发现
  • ORDER BY 字段内的 MySQL 子查询。 (没有内连接)

    有很多与此相关的问题 但都具有使用内部联接的相同答案 这 我认为 在这里是不可能的 如果我错了请告诉我 我现在正在做的是调用两个不同的 mysql 查询来获取结果 它工作完美 db gt query SELECT FROM meta WHE
  • PHP 如何判断用户是否按下了 Enter 键或 Submit 按钮?

    我遇到的问题是我在一个表单中有多个提交输入 每个提交输入都有不同的值 我更愿意将它们保留为提交 Whenever the user presses Enter it is as though the topmost submit input
  • gmail 不断阻止 PHPmailer 登录

    我将在接下来的 8 小时内部署一个网站 而 Gmail 刚刚停止接受 PHPmailer 登录我的帐户 起初 它在测试过程中工作了几个小时 然后 它就停止工作了 我已经允许所有允许不太安全的应用程序从 gmail 登录 但它仍然不允许 ph
  • openssl_pkey_get_details($res) 不返回公共指数

    我在用着这个例子 https stackoverflow com a 12575951 2016196使用 php 生成的密钥进行 javascript 加密openssl图书馆 但是 details openssl pkey get de
  • 删除PHP字符串中所有不匹配的字符?

    我有一个文本 我想从中删除所有不属于以下字符的字符 所需字符 0123456789 abcdefghijklmnopqrstuvwxyz n 最后一个是我确实想保留的 n 换行符 要匹配除列出的字符之外的所有字符 请使用反转字符集 http
  • 如何解压 PHP/Lumen/Laravel 的 gzip 请求?

    我收到来自第三方的 gzip 编码文本请求 1mb 所以这是有道理的 我的测试路线 router gt post testgzip function Illuminate Http Request request decompressed
  • 生成大随机数 php [重复]

    这个问题在这里已经有答案了 我想使用 PHP 生成一个包含 75 个字符的数字 我到处寻找 但一无所获 除了这个 http dailycoding com tools RandomNumber aspx http dailycoding c
  • 是否可以使用 PHP 重定向发送 POST 数据?

    更新 这不是重复的如何使用 PHP 发送 POST 请求 https stackoverflow com questions 5647461 how do i send a post request with php 那里的解决方案对我不起
  • Symfony2 Assetic 和 Less Sourcemaps

    我不确定如何破解 assetic less 过滤器以输出源映射文件 我这里指的是LessFilterhttps github com kriswallsmith assetic blob master src Assetic Filter
  • preg_match_all 查询仅显示有问题的外部组

    我无法弄清楚如何只显示 preg 查询的外部组级别 我会给你一个例子 preg match all start end input matches 这个输入start1 start2 2end 1end产生这个输出start1 start2
  • 使用 SSL 证书验证 Web 浏览器

    是否可以使用 ssl 证书对 Web 浏览器进行身份验证 假设我在应用程序中存储私钥 有什么方法可以从浏览器读取密钥并尝试基于该私钥进行身份验证 您可以使用 SSL TLS 客户端证书身份验证来对浏览器 用户进行身份验证 服务器必须请求客户
  • PHP 在输入流中使用 fwrite 和 fread

    我正在寻找将 PHP 输入流的内容写入磁盘的最有效方法 而不使用授予 PHP 脚本的大量内存 例如 如果可以上传的最大文件大小为 1 GB 但 PHP 只有 32 MB 内存 define MAX FILE LEN 1073741824 1
  • 随机组合 MySQL 数据库中的两个单词

    我有一个包含名词和形容词的数据库 例如 id type word 1 noun apple 2 noun ball 3 adj clammy 4 noun keyboard 5 adj bloody ect 我想创建一个查询 它将抓取 10
  • 如果循环中内存超出,我可以在 for 循环中抛出异常吗?

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何处理 foreach 循环中发生
  • php 错误 fopen(): 文件名不能为空

    发送带有附件代码的电子邮件工作正常 最近我们已将文件传输到另一个托管服务器 idk 发生了什么 它显示以下错误 警告 fopen 第 106 行 home hugerecruitmetnt public html validatecva p
  • 如何在 PHP 中从 IP 地址/国家/地区名称查找时区 ID?

    谁能告诉我 PHP 中是否有任何方法可以从 IP 地址或国家 地区名称获取时区区域 例如 亚洲 加尔各答 描述 我正在尝试根据他 她的国家 地区设置用户时区 我从他的 IP 地址获取用户所在国家 地区 但我需要该国家 地区的时区区域 例如
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主
  • 使用正则表达式提取两个短语之间的所有单词[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下正则表达式提取两个短语之间的所有单词 b item W w W 0 2 1 one W w W 0 3 business b b item W w W 0 2 3 three W w W 0 3
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐