我有:
这个简单的代码(sse.php):
<?php
// Set necessary headers
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
$lastId = 0;
while (true) {
$lastId++;
sendMessage($lastId, rand(1, 99));
sleep(1);
}
// Function to send data in format "ticket:price".
function sendMessage($id, $data)
{
echo "id: $id\n";
echo "data: $data\n\n";
ob_flush();
flush();
}
如果我在控制台中运行它:
curl http://localhost/sse.php
我会看到我想看的东西(例子):
id: 1
data: 41
id: 2
data: 12
id: 3
data: 7
id: 4
data: 10
但如果我尝试打开此链接http://localhost/index.php,我就无法做到。似乎它试图连接但没有任何成功:
当我重置curl(Ctrl+C
)时,片刻打开后片刻
浏览器中这个JS代码的情况相同:
var eventSource = new EventSource('/sse.php');
eventSource.onmessage = function(e) {
console.log("Пришло сообщение: " + e.data);
};
有效:
但我无法打开另一页。
eventSource.close()
之后一切正常。
如何解决此问题?我做错了什么?请帮助我// Sorry for my bad Enlish
PS:
我试图将这些来自互联网的行添加到apache配置中,没有任何改变:
<IfModule mpm_worker_module>
ServerLimit 250
StartServers 10
MinSpareThreads 75
MaxSpareThreads 250
ThreadLimit 64
ThreadsPerChild 32
MaxRequestWorkers 8000
MaxConnectionsPerChild 10000
</IfModule>
更新
我尝试使用其他设备连接到服务器。
curl http://localhost/sse.php
上运行此命令会导致浏览器出现问题。http://192.168.0.1/
并且打开时没有任何问题我认为apache或docker会限制每个客户端的连接,但无法在网络中找到任何信息......
更新2 更多信息:
答案 0 :(得分:0)
根据flush的文档,输出需要比只需要刷新到浏览器的一些字节更长。在调用echo strpad(' ', 2048);
flush()
之类的内容
答案 1 :(得分:0)
Found the solution!如果遇到此类问题,请尝试禁用xDebug并关闭会话session_write_close()
。
PHP锁定会话写入一个连接,并导致此问题