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

时间:2012-08-22 01:02:18

标签: php sockets browser

<?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);
?>

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

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

2 个答案:

答案 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)

  1. 有PHP的输出缓冲,可能已启用。按照Samyam A的描述刷新缓冲区。或者使用以下命令禁用它:using ob_end_flush();

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

  3. 有可能存在病毒扫描程序或工具栏作为代理服务器,它以首先获取完整数据块(甚至整个文档)的方式处理HTTP流,并在完成时他们处理并转发该块。如果你在端口100工作(这是阻止这些工具延迟数据流的常用技巧),这不应该发生。更多关于你在localhost工作。如果您之间有互联网提供商(特别是移动网络运营商),您可能会通过透明代理服务器隧道传输数据,这也会导致此类问题。