2016-04-19 8 views
1

Ich arbeite derzeit mit Server-Gesendete Ereignisse und ich habe ein seltsames Problem. Da die Veranstaltung geht weiter, bis jeder Iteration Ich erhalte den folgenden Fehler:Ob_end_flush generiert konstante Fehler

ob_end_flush(): failed to delete and flush buffer. No buffer to delete or flush in

Mein Code für den Server-Event Server Side ist wie folgt:

<?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); 
    } 

?> 

ich nicht vollständig Puffer zu verstehen. Bevor Sie davon ausgehen, dass dies eine schreckliche Praxis ist, sollten Sie wissen, dass Server-Sent-Ereignisse speziell sind. Dies ist ein ähnliches Skript, das auf MDN angezeigt wird. Aus diesem Grund bin ich mir nicht ganz sicher, warum ich diese Fehler ständig erhalte.

Vorschläge?

+1

Bevor Sie den Inhalt des Puffers senden können, müssen Sie einen mit [ob_start()] starten (http://php.net/manual/en/function.ob-start.php). Mit while (1) wird dieses Skript ausgeführt, bis der Server es zur maximalen Ausführungszeit stoppt. Ist es das was du willst? – larsAnders

+0

Ja, das ist, was Sie brauchen, damit Server-Gesendete Ereignisse richtig funktionieren – Shawn31313

+0

Starten Sie den Puffer mit: 'ob_start();' – Rasclatt

Antwort

1

ich immer dieses Idiom benutzt habe:

@ob_flush();@flush(); 

von S.21 Zitiert von Daten Push-Apps Mit HTML5 SSE: (Disclaimer: mein Buch

)

@ is said to be slow. But putting that in context, it adds on the order of 0.01ms to call it twice, as shown here. ... http://git.php.net/?p=php-src.git;a=blob;f=sapi/apache2handler/sapi_apache2.c#l290 suggests flush() can never throw an error, so @ on flush() could be dropped, just leaving it on @ob_flush().

http://git.php.net/?p=php-src.git;a=blob;f=main/output.c#l1328 zeigt die beiden E_NOTICEs dass ob_flush() geben kann.

2

In PHP enthält der Ausgabepuffer den tatsächlichen Inhalt, der auf die Seite gedruckt wird - im Wesentlichen alles, was wiedergegeben oder gedruckt wird. Für den Fall, dass Sie gar nichts zurückliefern, ist der Puffer leer und Sie erhalten eine Fehlermeldung, wenn Sie nichts mit ob_end_flush senden wollen. Sie könnten einfach einen Scheck hinzufügen, um diesen Fehler zu vermeiden:

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

sleep(2); 
Verwandte Themen