sleep () отключает eventSource [php] - PullRequest
0 голосов
/ 08 января 2020

пытается реализовать eventSource на стороне сервера php следующим образом:

header("Content-Type: text/event-stream");
header('Cache-Control: no-cache');
Date_default_timezone_set('Asia/Tehran');

$path = '/home/bluhbluh/public_html/sign_in/folderName/';


while(true){

    echo "retry: 1000" . PHP_EOL; // retry interval
    ob_end_flush();

    $files = array_diff(
        scandir('folderName/'),
        ['.','..']
    );

    $phoneNumbers = array();
    $p = '';
    foreach($files as $file){
        // read file
        $p = preg_replace(
            '/[^0-9]/', 
            '', 
            file_get_contents($path . $file, FILE_USE_INCLUDE_PATH)
        );

        $phoneNumbers[] = $p;

        // remove file
        unlink($path . $file);


       // send event
        // echo 'event: send' . PHP_EOL; // event type
        echo 'data: ' . $p, "\n\n"; // phoneNumber
        while (ob_get_level() > 0) {
            ob_end_flush();
        }
        flush();

    }


      if ( connection_status() != CONNECTION_NORMAL or connection_aborted() ) break;

      sleep(5);
}

if( ob_get_level() > 0 ) {
    while (ob_get_level() > 0)
        ob_flush();
    ob_end_clean();
}

, но eventSource не отправляет события!

, если я удаляю функцию sleep (), это работает просто отлично.

что вызывает здесь проблему?

Я сказал « Отключение звука », потому что он выполняет работу (сканирует каталог и все ...), кроме части отправляющего события.

, что еще более странно в том, что это прекрасно работает при локальном запуске, но не на удаленном общем хосте

- = - = - = - = - [обновление]

сервер, похоже, буферизует вывод. отключение буферизации решает проблему.

  • это работало локально, потому что удаленный сервер использовал mod_fastcgi и размер буферизации по умолчанию не равен 0 (как мой локальный сервер xampp apache)
...