需要 sse 时在 php 中冻结其他函数使用 while(true)

Posted

技术标签:

【中文标题】需要 sse 时在 php 中冻结其他函数使用 while(true)【英文标题】:freeze other function use while(true) in php when need sse 【发布时间】: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 应用程序中处理它。 【参考方案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/…跨度>

以上是关于需要 sse 时在 php 中冻结其他函数使用 while(true)的主要内容,如果未能解决你的问题,请参考以下文章

WPF XAML Trigger中使用动画后 动画对象冻结的处理办法

PHP函数在运行时冻结整个网站

VC++ 2K8 中 SSE 编码的内在函数与内联 ASM

怎么利用python绘制sse值与k值的函数图像

string 'w32' == 0 在 php 中计算为 true。嗯?

使用 Apache 时在 PHP 中设置用于访问的环境变量