2016-12-03 17 views
-1

У меня есть этот код:Серверные События в PHP отправить все события сразу в конце

<?php 

class Events { 
    function __construct($fn, $options=array()) { 
     $settings = array_merge(array(
      'headers' => array(
       'Content-Type' => 'text/event-stream', 
       'Cache-Control' => 'no-cache', 
       'Connection' => 'keep-alive' 
      ), 
      'retry' => 2000 
     ), $options); 
     foreach($settings['headers'] as $header => $value) { 
      header("$header: $value"); 
     } 
     $lastId = intval(isset($_SERVER["HTTP_LAST_EVENT_ID"]) ? $_SERVER["HTTP_LAST_EVENT_ID"] : 0); 
     echo ":" . str_repeat(" ", 2048) . "\n"; 
     echo "retry: " . $settings['retry'] . "\n"; 
     $id = $lastId; 
     $i = 0; 
     foreach ($fn($id) as $value) { 
      echo "id:" . $id++ . "\n"; 
      echo "data: " . $value . "\n\n"; 
      ob_flush(); 
      flush(); 
      if ($i++ == 10) { 
       break; 
      } 
     } 
    } 
} 
if (isset($_SERVER['HTTP_ACCEPT']) && preg_match("%text/event-stream%", $_SERVER['HTTP_ACCEPT'])) { 

    new Events(function($id) { 
     while(true) { 
      $array = array("Foo", "Bar", "Baz", "Quux"); 
      yield json_encode(array("message" => $array[array_rand($array)])); 
      sleep(1); 
     } 
    }); 
} else { ?><!DOCTYPE HTML> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta charset="utf-8" /> 
    <title>Leash</title> 
    <meta name="Description" content=""/> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> 
    <script> 
var source = new EventSource("/EventSource.php"); 
source.addEventListener("message", function(message) { 
    console.log(JSON.parse(message.data).message); 
}); 
    </script> 
    <body> 
     <textarea></textarea> 
    </body> 
</html><?php } ?> 

он работает локально на WAMP сервер, но это сделать не на мой виртуальный хостинг, у меня есть это в PHP информации :

Server API   CGI/FastCGI 

Directive   Local Value Master Value 
output_buffering 4096   4096 

, и я не в состоянии изменить его, я пытаюсь добавить ob_start() в мой сценарий также ini_set('output_buffering', 0) и удаление ob_flush, но это не помогло.

Я также пытаюсь установить output_buffering в 0 в .user.ini для каталога, а информация о php показывает, что значение Local равно 0, но события на стороне сервера все еще не работают, я получаю все события одновременно и инструменты разработчика говорят (pending) с пустым типом, пока он не закончится через 10 секунд.

Developer tools

Кто-нибудь знает, как это исправить?

+0

сервер имеет некоторое сжатие (GZIP или подобное)? – kikko088

+0

@ kikko088 'zlib.output_compression' установлен на Off – jcubic

+0

попробуйте добавить заголовок (« X-Accel-Buffering: no ») – kikko088

ответ