<?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);
?>
发送请求后,我立即在浏览器上获得输出(及其之前的所有空格)。
如何在不发送大量数据的情况下立即在浏览器中获取输出?
答案 0 :(得分:2)
您可能会看到这种行为,因为在您的第一种情况下,您发送的数据太小,因此输出缓冲区可能会保留它,直到填充足够的数据或关闭连接。
尝试使用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 :(得分:1)
有PHP的输出缓冲,可能已启用。按照Samyam A的描述刷新缓冲区。或者使用以下命令禁用它:using ob_end_flush();
浏览器本身可能会忽略数据,直到超过某个限制(~1KB)或连接已关闭。这是由于一些优化。他们假设文档的前1KB没有足够的有用信息来呈现文档的预览。解决方案:在开头发送1KB的虚拟数据(例如空白)。然后照常发送数据。
有可能存在病毒扫描程序或工具栏作为代理服务器,它以首先获取完整数据块(甚至整个文档)的方式处理HTTP流,并在完成时他们处理并转发该块。如果你在端口100工作(这是阻止这些工具延迟数据流的常用技巧),这不应该发生。更多关于你在localhost工作。如果您之间有互联网提供商(特别是移动网络运营商),您可能会通过透明代理服务器隧道传输数据,这也会导致此类问题。