浏览器不会立即显示收到的套接字数据


browser doesn't show received socket data immediately

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '127.0.0.1', 100);
socket_listen($socket);
$client = socket_accept($socket);
socket_write($client, 'output');
sleep(10);
socket_close($client);
socket_close($socket);
?>

当我转到终端并键入nc localhost 100时,我会立即得到输出,如我所愿。
但是当我在浏览器的地址栏中键入" localhost:100 "时,单词输出会在 10 秒后显示。

但!
如果我将代码更改为:

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '127.0.0.1', 100);
socket_listen($socket);
$client = socket_accept($socket);
$str = '';
for ($index = 0; $index < 4096; $index++) {
    $str .= ' ';
}
socket_write($client, $str);
socket_write($client, 'output');
sleep(10);
socket_close($client);
socket_close($socket);
?>

发送请求后,我立即在浏览器上获得输出(以及它之前的所有空格(。

如何在不发送大量数据的情况下立即在浏览器中获取输出

您可能会看到这种行为,因为在第一种情况下,您发送的数据太小,因此输出缓冲区可能会一直保留它,直到填充足够的数据或关闭连接。

尝试使用 ob_implicit_flush() 刷新数据或在每次写入后显式调用ob_flush()

<?php
ob_implicit_flush();
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '127.0.0.1', 100);
socket_listen($socket);
$client = socket_accept($socket);
socket_write($client, 'output');
sleep(10);
socket_close($client);
socket_close($socket);
?>
  1. 有PHP的输出缓冲,可能已启用。按照Samyam A的描述冲洗缓冲区。或者使用以下方法禁用它:使用 ob_end_flush((;

  2. 浏览器本身可能会忽略数据,直到数据超过某个限制 (~1KB( 或连接关闭。这是由于一些优化。他们假设文档的前 1KB 没有足够的有用信息来呈现文档的预览。解决方案:在开头发送 1KB 的虚拟数据(例如空格(。然后正常发送数据。

  3. 有可能有一个病毒扫描程序或工具栏充当代理服务器,它以首先获取完整数据块(甚至整个文档(的方式处理HTTP流,完成后它们处理并转发该块。如果您在端口 100 工作,则不应发生这种情况(这是防止此类工具延迟数据流的常用技巧(。更多关于你在本地主机工作。如果您之间确实有互联网提供商(尤其是移动网络运营商(,则可能会通过透明的代理服务器通过隧道传输数据,这也会导致此类问题。