Server sent events work, but with a massive time delay

后端 未结 4 1268
醉话见心
醉话见心 2021-02-15 22:23

Ill start off by saying this works perfectly on my local machine, the js example below connects to stream.php and receives a continuous update of the servers current time every

相关标签:
4条回答
  • 2021-02-15 22:39

    @Derrick, your suggested ob_end_flush(); line got me close, but in more complex PHP than hello world code, I was still getting unwanted reopens on my SSE connections (I still don't fully understand why ob_end_flush() was doing that to me). So here's the pattern I'm now using (otherwise identical to your stream.php). In English, I'm turning off PHP output buffering before entering my infinite loop:

    // per http://www.php.net/manual/en/book.outcontrol.php:
    //     Clean (erase) the output buffer and turn off output buffering
    ob_end_clean();
    
    // how long PHP script stays running/SSE connection stays open (seconds)
    set_time_limit(60);
    while (true) {
    
      // use @Derrick's header/send code here
    
      ob_flush();  // note I don't turn off output buffering here again
      flush();
      sleep(1);
    }
    
    0 讨论(0)
  • 2021-02-15 22:39

    just add, ob_flush(); before flush() function in stream.php

    updated stream.php script is as below, observe ob_flush() function before flush() function.

    while(true)
    {
        // Headers must be processed line by line.
        header('Content-Type: text/event-stream');
        header('Cache-Control: no-cache');
    
        // Set data line
        print "data: " . date( 'G:H:s', time() ) . PHP_EOL . PHP_EOL;
    
        // Toilet
        **ob_flush();**
        flush();
    
        // Wait one second.
        sleep(1);
    }
    
    0 讨论(0)
  • 2021-02-15 22:41

    Server.php needs to be as follows:

    stream.php

    while(true)
    {
        // Headers must be processed line by line.
        header('Content-Type: text/event-stream');
        header('Cache-Control: no-cache');
    
        // Set data line
        print "Event: server-time" . PHP_EOL;
        print "data: " . date( 'G:H:s', time() ) . PHP_EOL;
        print PHP_EOL;
    
        ob_end_flush();     // Strange behaviour, will not work
        flush();            // Unless both are called !
    
        // Wait one second.
        sleep(1);
    }
    
    0 讨论(0)
  • 2021-02-15 23:02

    Sleep is blocking the SSE. I too had the same problem. I was advised to use event driven programming.

    0 讨论(0)
提交回复
热议问题