在php中读取常量UDP流

时间:2009-01-29 00:47:13

标签: php sockets

我如何阅读几乎不断发送到我服务器的数据。 协议是udp。如果我尝试读取while(1)循环,我什么都得不到。看起来读取只会在所有读取完成后回显。所以它等待循环完成读取它永远不会。我希望socket_read在获取数据时立即回显。这是不起作用的代码。提前谢谢。

<?php
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($sock, $local, $port) or die('Could not bind to address');

//this is where the reading loop should go.
while(1)
{
    echo socket_read($sock,1024);
}

socket_close($sock);
?>

4 个答案:

答案 0 :(得分:3)

尝试在echo语句后立即调用flush()

答案 1 :(得分:3)

我需要调用ob_flush();.从来没有听说过它。事实证明我的问题不是循环,而是事实上php在实际将内部缓冲区发送到Web浏览器之前自然等待脚本完成。调用flush();然后是ob_flush();将强制php立即将其存储的任何缓冲区发送到浏览器。对于不会停止(无限循环)并希望将数据回显到浏览器的脚本,这是必需的。有时flush()不起作用,因为在这种情况下它不起作用。希望有所帮助。

答案 2 :(得分:2)

这样的事情可能有所帮助:

do {
    echo socket_read($handle,1024);
    $status = socket_get_status($handle);
} while($status['unread_bytes']);

OR

while ( $buffer = @socket_read($sock,512,PHP_NORMAL_READ) )
    echo $buffer;

答案 3 :(得分:2)

关于socket_read()的PHP手册输入有点模糊,当谈到它正在做多少(如果有的话)内部缓冲。假设您传入1024 in的长度,则指定它应在收到不超过1024个字节的数据后返回。

免责声明:以下只是推测,因为我不了解socket_read()的内部实现。

如果socket_read()函数使用其length参数作为内部缓冲区大小的提示,则可能会看到使用小UDP数据包的性能不佳。例如,如果socket_read()等待1024字节的数据,而不管数据包的大小如何,如果你经常接收60字节的UDP数据包,那么填充缓冲区和返回函数需要一段时间。

(注意:在查找Tim提到的“unread_bytes”字段后,看起来PHP确实保留了内部缓冲区,但它没有提到它们可能有多大或多小。)

在这种情况下,一旦缓冲区填满,socket_read()将返回更大的数据块,以减少处理资源消耗,但代价是延迟更高。如果您需要尽可能多的数据包,可能会设置较低的长度字段。这将迫使socket_read()更快地返回,尽管代价是更频繁地执行循环。此外,如果您将长度设置得太低,您的socket_read()可能会开始返回不完整的数据包,因此您必须在代码中考虑该数据包。 (当然,如果这对您的申请很重要。)