sleep()使eventSource[php]静音
尝试在服务器端php上实现eventSource,如下所示: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" .
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)
?