卡在永恒的循环上

时间:2017-12-12 16:29:21

标签: javascript php apache docker

我有:

这个简单的代码(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>

更新

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

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

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

更新2 更多信息:

2 个答案:

答案 0 :(得分:0)

根据flush的文档,输出需要比只需要刷新到浏览器的一些字节更长。在调用echo strpad(' ', 2048);

之前尝试添加flush()之类的内容

答案 1 :(得分:0)

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