卡在永恒的循环上

问题描述 投票:2回答:2

我有:

这个简单的代码(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,我不能这样做。似乎它试图连接但没有任何成功:

Eternal loading

当我重置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>

UPDATE

我尝试使用其他设备连接到服务器。

  • 我在PC curl http://localhost/sse.php上运行此命令会导致浏览器出现问题。
  • 我在移动浏览器中打开http://192.168.0.1/,它打开没有任何问题

我认为apache或docker限制每个客户端的连接,但无法在Web中找到任何信息...

更新2更多信息:

javascript php apache docker
2个回答
0
投票

根据flush的文档,输出需要比只有一些字节长,才能真正刷新到浏览器。在调用echo strpad(' ', 2048);之前尝试添加类似flush()的东西


0
投票

Found the solution!如果遇到这样的问题,请尝试禁用xDebug并关闭会话session_write_close()。 PHP锁定会话写入一个连接,它导致此问题

© www.soinside.com 2019 - 2024. All rights reserved.