PHP 服务器发送事件连接不会关闭?

2023-12-24

我已经实施了一个服务器发送事件 https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events with 事件源 https://developer.mozilla.org/en-US/docs/Web/API/EventSource在我的网络应用程序上。 基本上在 javascript 中我的代码如下所示:

    var myEventSource;
    if (typeof(EventSource) !== "undefined" && !myJsIssetFunction(viridem.serverSideEvent.config.reindexProcessingEvent)) {
        myEventSource = new EventSource('/my/url/path.php?event=myevent');
        EventSource.onmessage = function(e) {
          [...] //Dealing with e.data that i received ...
        }
    }

在 PHP 方面我有这样的东西:

<?php
  header('Content-Type: text/event-stream');
  header('Cache-Control: no-cache');
  header("Access-Control-Allow-Origin: *");

  //this or set_the_limit don't work but whatever I can deal without it
  ini_set('max_execution_time', 300);
  //ignore_user_abort(true); tried with true and false

  bool $mustQuit = false;

  while (!$mustQuit && connection_status() == CONNECTION_NORMAL) {
     if(connection_aborted()){
      exit();
     }
     [...] //doing some checkup

    if ($hasChange) {
      //Output stuffs
      echo 'data:';
      echo json_encode($result);
      echo "\n\n";
      ob_flush();
      flush();
      sleep(5);
    }

  }

从以下位置找到的答案:PHP 事件源持续执行 https://stackoverflow.com/questions/12918650/php-event-source-keeps-executing,“text/event-stream”标头应该使连接自动关闭,但在我的情况下却没有。

我确实在 window.onbeforeunload 事件中添加了 eventsource.close 但它没有关闭该事件。

window.onbeforeunload =  function() {
    myEventSource.close();
    myEventSource = null;
};

如果我查看浏览器的网络部分,我可以看到标头是(添加最大循环 30 后): 内容类型:文本/事件流;字符集=UTF-8

响应标头:

访问控制允许来源:*

缓存控制:无缓存

连接:保持活动状态

内容类型:文本/事件流;字符集=UTF-8

服务器:Apache/2.4.18(Ubuntu)

日期:2018 年 4 月 26 日星期四 20:29:46 GMT

到期时间: 1981 年 11 月 19 日星期四 08:52:00 GMT

请求标头:

连接:保持活动状态

接受:文本/事件流

缓存控制:无缓存

注意:我确认脚本仍在运行并带有日志,并使用始终递增的 bash (ps -ax | grep -c apache2) 检查 apache2 进程。


感谢@LawrenceCherone 的帮助,我确实发现你需要“输出数据”才能使connection_aborted 工作......

就我而言,我仅在需要时才输出数据......

通过增加

   if ($hasChange) {
      //Output stuffs
      echo 'data:';
      echo json_encode($result);
      echo "\n\n";
      ob_flush();
      flush();
      sleep(5);

    } else {
       echo 'data:';
       echo "\n\n";
       ob_flush();
       flush();
       if(connection_aborted()){
         exit();
       }
       sleep(5);
    }

connection_aborted 开始工作。

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

PHP 服务器发送事件连接不会关闭? 的相关文章

  • CURL 中的 data-urlencode 是什么意思?

    我搜索了很多个小时试图弄清楚 php curl 中的 data urlencode 是什么 我尝试过这个 但我认为这是不对的 xmlpost object1 file https www lob com goblue pdf 在文档中是 d
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 使用正则表达式提取两个短语之间的所有单词[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下正则表达式提取两个短语之间的所有单词 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
  • 简单的 PHP 表单:电子邮件附件(代码 Golf)

    想象一下 一个用户想要在其网站上放置一个表单 该表单将允许网站访问者上传一个文件和一条简单的消息 该消息将立即通过电子邮件发送 即 该文件未存储在服务器上 或者如果该文件存储在服务器上 仅暂时 作为文件附件 并在邮件正文中添加注释 查看更多
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser
  • “空合并”(??) 运算符的用途是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 随着新的 PHP 版本 PHP 7 的发布 引入了新功能 这些新功能中有一个我不熟悉的操作符 这Nul
  • 什么时候适合在 PHP 中使用引用传递?

    在C 中 如果将一个大数组传递给函数 则需要通过引用传递它 这样它就不会被复制到新函数中浪费内存 如果您不想修改它 可以通过 const 引用传递它 任何人都可以验证通过引用传递也可以节省我在 PHP 中的内存吗 我知道 PHP 不像 C
  • phpspreadsheet setCellValue 未写入

    我正在上传一个 Excel 文件 读取内容并使用 phpspreadsheet 写入一个新的 Excel 文件 我正在尝试创建一个 Excel 文件 我正在使用以下代码写入单元格 writesheet gt setActiveSheetIn
  • ResourceBundle 返回 NULL,没有引发任何错误

    对于国际化数据 与 ResourceBundle来自 PHP 的 intl 扩展的类 我运行了扩展 PHP 5 3 4 Windows 并使用以下命令创建了一个 dat 文件ICU 数据库定制器 http apps icu project
  • 如何从表中选择所有偶数 id?

    我想从 MySQL 数据库的表中选择所有甚至帖子 ID 然后显示它们 我还想获取所有带有奇怪 id 的帖子并将它们显示在其他地方 我想使用 PHP 来完成此操作 因为这是我使用的服务器端语言 或者 我是否必须选择所有帖子 然后使用 Java
  • CodeIgniter PHP 模型访问“无法找到您指定的模型”

    我一直在尝试为我正在构建的这个网站加载一些模型 但不知道什么原因 会带来如下错误 An Error Was Encountered Unable to locate the model you have specified logon mo
  • Laravel + AngularJS Nginx 路由

    我有以下问题 我需要配置Nginx 这样在任何URL用户访问时 它都会保留uri 例如domain com some url 但仅传递给 laravel 并让 Angular 处理路由 Route get function return v
  • 使用 jquery 和 php 测试表单输入是否为 1 或 2 位整数

    我有一个表单 其中有五个字段全部设置为 maxlength 2 基本上 我希望唯一可以输入的值是一位或两位整数 因为在将值存储在数据库中之前对这些字段执行计算 是否有任何 jquery 不允许用户输入不是整数的值 另外 用 jquery 和
  • 是否可以在 php.ini 中指示 PHP 使用 postfix 配置?

    是否可以配置 PHP 使用 postfix 的配置集发送电子邮件 WordPress 通过 PHPMailer 依赖于 php ini 中的这些设置是否正确 SMTP localhost http php net smtp port smt
  • 对文本变量进行数学求和? (例如 5865/100 )

    我有一个变量是 whatever 5865 100 这是一个文本变量 我希望它计算 5865 100 以便我可以将其添加到其他数字并进行计算 Number format 不起作用 因为它只返回 5 865 而我希望它返回 58 65 我可以
  • 如何使用 Mockery 在第 N 次调用模拟方法时抛出异常

    我需要测试我编写的某些代码多次调用另一个类上的方法时的行为 其中一次调用将导致抛出异常 我在用Mockery http docs mockery io模拟可能引发异常的类 因此 就我而言 该方法将被调用三次 我需要它在第二次抛出异常 这是我
  • 如何调试 Silex 框架中的 php 致命错误

    我想知道如何看到这样的语法错误 缺少分号 这将导致 WSOD 白屏死机 我尝试包含一个调试配置文件 如下所示 use Symfony Component Debug ErrorHandler use Symfony Component De
  • 使用 ActiveRecord 和 Yii2 记录实际的 SQL 查询?

    我正在这样做 students Student find gt all return this gt render process array students gt students 然后在视图中 foreach students as
  • 在网络托管上发布后,php 会话无法正常工作

    我的网站在本地主机上运行良好 但是一旦我将其部署到我的托管服务 会话就会停止工作

随机推荐

  • 使用 Java 中的算法更改绘图的角度/位置

    你好 我很好奇如何解决这个问题 我用 Java 中的 fillArc drawArc 方法创建了一个 pacman 现在我的屏幕上有一个 pacman 家伙 无论它朝哪个方向走 它总是向右看 我的问题是 有没有办法在Java中改变对象的角度
  • 如何为嵌套类函数编写 Frida 钩子?

    安卓版本6 0 1 弗里达 v 12 2 19 我是弗里达的新手 不知道如何解决这个问题 我的目标函数位于路径 com gt appname gt folder gt xyz class 在 xyz class 中 该类的嵌套如下 publ
  • 如何获取两个日期之间的所有产品?

    如何获取两个日期之间的所有产品 例如上个月产品 本月产品 上周产品和本周产品等 我尝试过这个 current day to start with start mktime 0 0 0 date m date d date Y calcula
  • 使用父宏的右括号的 C 预处理器

    我有这个有效的代码 include
  • gRPC Python thread_pool 与 max_concurrent_rpcs

    当启动Python时grpc server 有什么区别maximum concurrent rpcs和max workers在线程池中使用 如果我愿意maximum concurrent rpcs 1 我还应该向线程池提供多个线程吗 换句话
  • 域名已与“现有”CloudFront 分配关联

    当我尝试通过设置域时无服务器域管理器 https github com amplify education serverless domain manager with sls create domain 失败并显示 BadRequestE
  • 进行输出重定向

    我想将 make 命令的输出和错误流重定向到文件 以下命令 make 1 gt 2 tmp build log 抛出以下错误 make Nothing to be done for Users m tmp build log EDIT Tr
  • 这很可能是瞬态情况,可以通过后退重试来纠正

    我在我的项目中使用 firebase 并且遇到了下面提到的一些问题 cloud firestore unavailable 该服务当前不可用 这很可能是一种瞬态情况 可以通过后退重试来纠正 我正在使用 firebase lib 版本 fir
  • HttpClient 将 byte[] 发送到 WCF 服务会产生错误:最大数组长度配额 (16384) 或最大项目数

    我有一个 WCF 服务可以接受byte 我正在使用创建一个客户端HttpClient并收到以下错误 我在网上读到你必须设置readerQuotas在服务器和客户端上 但是如何在服务器上设置这些设置HttpClient Error 反序列化
  • Perl 中@_ 的含义是什么?

    是什么意思 在 Perl 中 佩尔多克 佩尔瓦尔 http perldoc perl org perlvar html ARG是检查任何特殊命名的 Perl 变量信息的第一个地方 Quoting 子程序内的数组 包含传递给该子例程的参数 更
  • 如何添加排名栏?

    我想选择记录并确定每个相似数据的排名号 我的数据如下 MEMBER ID LOAN AMOUNT 1 2 000 00 2 1 000 00 3 4 000 00 4 1 000 00 我想要的结果如下所示 RANK MEMBER ID L
  • 使用 netlink API 设置无线通道

    我正在Ubuntu Linux 12 04环境中开发WiFi工具 我需要在不同通道之间切换WiFi接口 目前 我在 Wireshark 源代码 ws80211 utils c 中名为 ws80211 set freq 的函数中找到了解决方案
  • FPDF 错误:此文档(mine.pdf)可能使用了 FPDI 附带的免费解析器不支持的压缩技术[重复]

    这个问题在这里已经有答案了 如何解决问题 制作模板时 使用 PDF A 1a 导出设置将其导出 在 Acrobat Pro 中 您可以使用此设置另存为 更多详细信息 MAC OS X 但也应该适用于 WIN 在 acrobat pro 中打
  • Touchenter 和 touchleave 事件支持

    我读到了有关 touchenter 和 touchleave 事件的信息 位于莫兹拉网站 https developer mozilla org en US docs Web API TouchEvent and w3网站 http www
  • 如何在 PHP 中设置深度数组

    假设我有以下功能 function setArray array key value array key value 上面的函数中 key只在第一层 如果我想在第二层或第三层设置key 如何重写函数 e g array foo bar te
  • 如何查看初始化权重(即训练前)?

    我正在使用 Keras 生成一个简单的单层前馈网络 当通过以下方式初始化权重时 我想更好地处理权重的值kernel initializer争论 有没有办法可以在初始化后 即训练完成之前 查看权重值 只需使用get weights 在模型上
  • 包含字符串文字的文档测试

    我有一个单元测试 我想为一个将 XML 作为字符串的函数编写 这是一个文档测试 我希望 XML 与测试一致 由于 XML 是多行的 我在文档测试中尝试了字符串文字 但没有成功 这是简化的测试代码 def test gt gt gt conf
  • Excel VBA 合并/组合具有相同名称的列

    我的项目工作存在类似于下面描述的问题 My dataset is like this What I want is like this LAST COLUMN 我拥有的是许多同名的列 例如 Is paid Job 我想要的是创建一个新列 T
  • 数据库不存在错误

    当我进行数据库备份时 出现数据库不存在的错误 但我可以正常附加数据库 并且其他进程 例如数据插入和更新 工作正常 但是当我进行数据库备份时 出现以下错误 我显示了错误屏幕截图和备份按钮代码 string cnstr Data Source
  • PHP 服务器发送事件连接不会关闭?

    我已经实施了一个服务器发送事件 https developer mozilla org en US docs Web API Server sent events with 事件源 https developer mozilla org e