【问题标题】:freeze other function use while(true) in php when need sse需要 sse 时在 php 中冻结其他函数使用 while(true)
【发布时间】:2021-10-21 04:36:19
【问题描述】:

嗨,我需要在我的代码中使用 sse,它需要 while(true) 运行,所以当我使用它时,其他功能不起作用我需要同时工作功能

        while (true) {
            echo $this->event->fill();
            ob_flush();
            flush();
            if (connection_aborted()) {
                return;
            }
            sleep($interval);
        } 

这是我的循环函数

  public function index(Request $request)
    {
//do something
}

我先运行循环函数,然后运行索引函数,但这会冻结,直到循环函数运行

【问题讨论】:

  • 我真的不明白你在这里要做什么,但while(true) 是一个问题的根源。永远不要创建一个无限循环......
  • 我必须使用因为我想要一个类似于这个link或这个link2的应用
  • 不,您永远不必使用它!总有解决它的好方法。无限循环永远不能解决任何问题。你不能让 PHP 函数无休止地运行,有一个 max_execution_time(谢天谢地)
  • 您的解决方案是什么?我需要在我的应用程序中使用 sse 添加 sse 需要 while(true) ,当我使用它而其他功能不起作用时
  • 不清楚你到底想做什么,所以我不能给你解决方案。但是你永远“不需要”while(true) 例如,如果它是来自你的 vue 的 ajax 调用,你可以在你的 vue 应用程序中处理它。

标签: php laravel websocket server-sent-events


【解决方案1】:

我先运行循环函数,然后运行索引函数...

您不能运行一个无限循环,然后再运行一个函数。 :-)

我认为您是说您希望在处理 SSE 循环时定期调用 index()?如果你的睡眠 $interval 是 1 秒,并且你希望每 5 秒调用一次 index(),你可以这样做:

for($i=0;;$i++){
     echo $this->event->fill();
     ob_flush();
     flush();
     if (connection_aborted()) {
        return;
     }
     sleep($interval);
    if($i % 5 == 0)index(???);
}

顺便说一句,for(;;){...} 是另一种编写while(true){...} 无限循环的方式。

我不知道您的 $request 参数来自哪里,所以我只是将其显示为上面的 ???

退后一步,尝试猜测index($request) 可能在做什么,请确保您了解每个连接的客户端都在运行一个 SSE 进程。它是一个专用进程,并且在运行时也不会从客户端接收任何进一步的信息。 IE。如果index() 正在创建一个索引供它属于另一个进程的所有客户端使用,并行运行。

【讨论】:

  • 其实我是想让这个while函数运行那个SSE的连接就建立起来了,连接之后,如果一个人选择了另外一个路由,该路由将被执行,并且不会等待第一个运行结束。
  • @hh 您需要两个进程让客户端“选择另一条路线”。 SSE 是事件推送的专用进程。它无法直接对用户在启动后所做的任何事情做出反应。 (但它可以间接做出反应:例如,您可以让用户操作修改 SSE 进程定期轮询的数据库中的数据。)
【解决方案2】:

我猜你正在使用 php 内置服务器作为你的 web 服务器(如果你使用 php artisan serve 来运行你的 laravel 项目就是这种情况)。 Here 它说:

Web 服务器只运行一个单线程进程,因此如果请求被阻止,PHP 应用程序将停止

这仅仅意味着您无法使用此 Web 服务器实现服务器发送的事件。

您需要使用另一个网络服务器(摆脱 php artisan serve)。

【讨论】:

  • OP使用输出缓冲区,可以根据PHP逻辑控制输出显示。它不需要多线程进程。
  • @Raptor,OP代码的问题是他要同时处理两个请求,不能用php内置的web服务器完成,看这个:pretagteam.com/question/…跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 2016-04-27
  • 2018-11-17
  • 2014-03-15
相关资源
最近更新 更多