循环是否返回服务器端事件所需的多个值?
Is a loop returning multiple value required on server side events?
我正在 php 学习 server side events。
起初,几乎每个示例在服务器端都有一个循环,并且 return 使用 ob_flush() / flush() 计算值。所以我试着这样做:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
// Output a 'waiting message'
$progress = 0;
while ($progress < 100) {
echo 'data:';
echo $progress;
echo "\n\n";
flush();
ob_flush(); //I tried ob_implicit_flush(true) too
$progress++;
sleep(1);
}
?>
和javascript:
function start(btn) {
var source = new EventSource('/fix/streamingGet.php');
source.onmessage = function(e) {
console.log(e.data);
};
}
但是直到脚本结束才收到任何东西......
所以我最终尝试没有无限循环并且一切正常
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
// Output a 'waiting message'
echo 'data:';
echo rand(5, 15);
echo "\n\n";
?>
编辑:没关系,我之前可能在某个地方犯了错误,因为现在可以了
编辑:我的意思是一个循环 return 与 ob_flush/flush 的多个结果(不是无限循环,我的错)
但是我是否需要 return 多次刷新我的数据才能获得 Server Side Envents 的性能?
更新:
根据我的测试和研究,php 似乎不允许多个会话,这使得第一个示例阻止对服务器的任何其他调用。因此,唯一有效的 php 解决方案似乎每次都 return 有价值。我认为这与对服务器进行多次 ajax 调用是一样的。
我猜如果我真的想从服务器流式传输一个值,那么我应该在我的网络应用程序端使用 nodejs。
你的做法基本上是正确的。
但是把ob_flush()
放在flush()
之前(因为ob_flush()
刷新PHP缓冲区给Apache,然后flush()
告诉Apache发送its 缓冲内容到客户端)并且将 @
放在 ob_flush()
之前更健壮(因为如果你关闭了 PHP 缓冲,你可能会得到一个错误消息 - @
抑制了它)。
(关于在 PHP 中使用无限循环的评论是错误的:在这种情况下它们很好。当浏览器客户端断开连接时,Apache 将杀死 PHP 实例。没有内存泄漏仅来自 运行 一个 infinite/long-running 循环。)
PHP 会话锁定。因此,如果同一用户(同一会话)可能在 SSE 脚本发送数据时访问您站点的其他部分,则您需要 SSE 脚本停止使用会话。因此,从脚本顶部的会话中获取所需的任何数据,然后在进入主循环之前调用 session_write_close()
。参见
我正在 php 学习 server side events。
起初,几乎每个示例在服务器端都有一个循环,并且 return 使用 ob_flush() / flush() 计算值。所以我试着这样做:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
// Output a 'waiting message'
$progress = 0;
while ($progress < 100) {
echo 'data:';
echo $progress;
echo "\n\n";
flush();
ob_flush(); //I tried ob_implicit_flush(true) too
$progress++;
sleep(1);
}
?>
和javascript:
function start(btn) {
var source = new EventSource('/fix/streamingGet.php');
source.onmessage = function(e) {
console.log(e.data);
};
}
但是直到脚本结束才收到任何东西......
所以我最终尝试没有无限循环并且一切正常
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
// Output a 'waiting message'
echo 'data:';
echo rand(5, 15);
echo "\n\n";
?>
编辑:没关系,我之前可能在某个地方犯了错误,因为现在可以了
编辑:我的意思是一个循环 return 与 ob_flush/flush 的多个结果(不是无限循环,我的错)
但是我是否需要 return 多次刷新我的数据才能获得 Server Side Envents 的性能?
更新:
根据我的测试和研究,php 似乎不允许多个会话,这使得第一个示例阻止对服务器的任何其他调用。因此,唯一有效的 php 解决方案似乎每次都 return 有价值。我认为这与对服务器进行多次 ajax 调用是一样的。
我猜如果我真的想从服务器流式传输一个值,那么我应该在我的网络应用程序端使用 nodejs。
你的做法基本上是正确的。
但是把ob_flush()
放在flush()
之前(因为ob_flush()
刷新PHP缓冲区给Apache,然后flush()
告诉Apache发送its 缓冲内容到客户端)并且将 @
放在 ob_flush()
之前更健壮(因为如果你关闭了 PHP 缓冲,你可能会得到一个错误消息 - @
抑制了它)。
(关于在 PHP 中使用无限循环的评论是错误的:在这种情况下它们很好。当浏览器客户端断开连接时,Apache 将杀死 PHP 实例。没有内存泄漏仅来自 运行 一个 infinite/long-running 循环。)
PHP 会话锁定。因此,如果同一用户(同一会话)可能在 SSE 脚本发送数据时访问您站点的其他部分,则您需要 SSE 脚本停止使用会话。因此,从脚本顶部的会话中获取所需的任何数据,然后在进入主循环之前调用 session_write_close()
。参见