如何通过PHP实现Server-Sent Events(SSE)即时推送事件?
PHP实现Server-Sent Events(SSE)无法即时触发事件的问题
我尝试用PHP实现Server-Sent Events(SSE),但浏览器无法即时触发事件。
我的代码:
<?php // Headers must be processed line by line. header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); header('X-Accel-Buffering: no'); while(true) { // Set data line echo "event: server-time"; echo "data: " . date( 'G:H:s', time() ); //echo str_repeat(" ", 4096); ob_end_flush(); // Strange behaviour, will not work flush(); // Unless both are called ! // Wait one second. sleep(1); }
代码可运行,但存在缓冲区最小大小限制,需达到该大小才会向浏览器刷新发送数据。取消注释str_repeat行后,事件几乎每秒即时推送;若保留注释,浏览器会持续加载约2分钟后才发送累计数据。
我已在Stack Overflow查找方案,但未找到通用解决办法。
PHPINFO相关信息:
| 名称 | 值 |
|---|---|
| Server API | FPM/FastCGI |
| PHP Version | 7.4.30 |
| BZip2 Support | Enabled |
| Registered PHP Streams | https, ftps, compress.zlib, compress.bzip2, php, file, glob, data, http, ftp, phar, ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp, zip |
| Registered Stream Socket Transports | tcp, udp, unix, udg, ssl, tls, tlsv1.0, tlsv1.1, tlsv1.2, tlsv1.3 |
| Registered Stream Filters | zlib., bzip2., convert.iconv., string.rot13, string.toupper, string.tolower, string.strip_tags, convert., consumed, dechunk, mcrypt., mdecrypt., http.* |
| Stream Wrapper support | compress.bzip2:// |
| Stream Filter support | bzip2.decompress, bzip2.compress |
| BZip2 Version | 1.0.6, 6-Sept-2010 |
| output_buffering | no value |
| output_encoding | no value |
| output_handler | no value |
| zlib.output_compression | Off |
| zlib.output_compression_level | -1 |
| zlib.output_handler | no value |
内容的提问来源于stack exchange,提问作者Gugu72
相关产品推荐
相关产品推荐

