sleep()使eventSource[php]静音

sleep()使eventSource[php]静音,php,server,server-sent-events,Php,Server,Server Sent Events,尝试在服务器端php上实现eventSource,如下所示: 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上实现eventSource,如下所示:

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本地服务器一样)

它不是无限运行吗?您是否启动了一个
ob_start()
@Dilek yes它无限期运行,不在代码中,但现在测试它,似乎没有任何区别,它应该在while循环之外吗?是的,我没有看到工作的
sleep()循环中的函数,因为while循环正在重复
sleep()所以它将查询驱动到无穷大。应该有其他一些方法使它在循环中工作,但我还没有看到任何方法。如果($value==true){
每个人都推荐它,就像@Dilek做了一个递归方法而不是while循环一样,没有什么区别。这就是你所说的
如果($value==true)