Ob_end_flush正在生成常量错误


Ob_end_flush is generating constant errors

我目前正在处理服务器发送的事件,遇到了一个奇怪的问题。随着事件的进行,在每次迭代中,我都会收到以下错误:

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

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

<?php
  require "connect.php";
  session_write_close();
  header("Content-Type: text/event-stream'n'n");
  $savedcount = 0; 
  while (1) {
    // Who's mechanism 
    $query = $mysqli->query("SOME QUERY"); 
    $rowcount = $query->num_rows;
    if ($savedcount != $rowcount) {
       // echo stuff
       $savedcount = $rowcount; // only echo stuff if there is new content
    }
    ob_end_flush();
    flush();
    sleep(2);
  }
?>

我不完全理解缓冲区。此外,在您认为这是一种可怕的做法之前,请知道服务器发送的事件是特殊的。这是他们在MDN上显示的类似脚本。出于这个原因,我不太清楚为什么我会不断收到这些错误。

建议?

在PHP中,输出缓冲区保存将打印到页面的实际内容——本质上是任何被呼应或打印的内容。因此,在根本不回显的情况下,缓冲区将是空的,并且当您尝试使用ob_end_flush不发送任何内容时,会出现错误。你可以添加一个检查来避免这个错误:

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

我一直使用这个成语:

@ob_flush();@flush();

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

@据说是缓慢的。但将其放在上下文中,调用两次会增加0.01ms的数量级,如图所示。。。。http://git.php.net/?p=php-src.git;a=斑点;f=sapi/apache2handler/sapi_apache2.c#l290建议flush()永远不会抛出错误,所以可以删除@on flush(),只保留在@ob_flush()上。

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