需要 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中使用动画后 动画对象冻结的处理办法