Ob_end_flush正在生成常量错误

时间:2016-04-19 01:20:47

标签: javascript php buffer server-sent-events

我目前正在处理Server-Sent Events,我遇到了一个奇怪的问题。随着事件的继续,每次迭代我都会收到以下错误:

  

ob_end_flush():无法删除并刷新缓冲区。没有要删除的缓冲区   或冲洗

我的服务器事件服务器端代码如下:

var userName = prompt("Whats your name?") ; 
var userBorn = prompt ("Hey " + userName + " What year where you born?") ; 
var userAge = prompt ("hmm so if you were born " + userBorn + " that would make 
you how old today?") ; 
var newAge = function (yearsAlive) {
  yearsAlive = this.yearBorn + this.age ; 
  if (yearsAlive === 2016)  {
    document.write("That Sounds about right to me ! ");
  } else {
    document.write("Your age cant be right , please try again");
  } 
} ; 
var me = {
  name: userName , 
  yearBorn: userBorn, 
  age: userAge,
  years: newAge
} ; 
me.years() ;

我不完全理解缓冲区。此外,在您认为这是一个糟糕的做法之前,请知道Server-Sent Events是特殊的。这是他们在MDN上显示的类似脚本。出于这个原因,我不确定为什么我会不断收到这些错误。

建议?

2 个答案:

答案 0 :(得分:2)

在PHP中,输出缓冲区保存将打印到页面的实际内容 - 基本上是回显或打印的任何内容。因此,如果您根本不回显任何内容,则缓冲区将为空,当您尝试使用ob_end_flush发送任何内容时,您将收到错误。您可以添加一个检查以避免此错误:

if (ob_get_length() > 0) {
    ob_end_flush();
    flush();
}

sleep(2);

答案 1 :(得分:1)

我一直用这个成语:

@ob_flush();@flush();

使用HTML5 SSE从数据推送应用程序的第21页引用:(免责声明:我的书)

  据说@很慢。但是把它放在上下文中,它会增加0.01ms的数量来调用它,如图所示。   ...   http://git.php.net/?p=php-src.git;a=blob;f=sapi/apache2handler/sapi_apache2.c#l290表示flush()永远不会抛出错误,因此可以删除@ flush()上的@,只需将其保留在@ob_flush()上。

http://git.php.net/?p=php-src.git;a=blob;f=main/output.c#l1328显示了ob_flush()可以提供的两个E_NOTICE。