我正在测试一个依赖于另一个基于流的库的PHP库。我的经验是使用与流相比较低级别的套接字,所以我不确定流是否足够灵活。
基本上,使用套接字,我会编写一个缓冲循环来检查像\n
这样的EOL字符的每个数据块,如此...
PHP
$data = NULL;
while ($buffer = socket_read($connection,1024)) {
$data .= $buffer;
if (strpos($buffer, "\n") !== FALSE) {
$data = substr($data,0,-1);
break;
}
}
我正在寻找类似的东西而不必重写整个库。这是问题......
stream_get_line($handle,$length,$EOL)
接受一个长度值,但会截断所有内容。 PHP文档说明......
读取长度字节时,读取结束时指定的字符串(未包含在返回值中)或EOF(以先到者为准)时读取结束。
...并且没有偏移参数,所以我不能以相同的方式使用它来获得余数。这意味着如果我不知道数据的长度,或者它是否不一致,我需要将length
设置得足够高以处理任何可能的数据长度。
这不是大问题,似乎有效。问题是会将$length
值设置为512000
(500Kb)会导致更短的响应带来大量不必要的开销吗?
答案 0 :(得分:1)
至于文档中的陈述:
当读取长度字节时,读取结束,当字符串时 找到由结尾指定的(不包括在返回中) 价值),或EOF(以先到者为准)。
这并不意味着如果您传递1,024甚至200,000的长度并且该行长于该行,则其他数据将被截断或丢失。这只是在此之前未达到EOF / EOL时呼叫将返回的最大数据量。
因此,如果你有一个长度为102,500字节的行并且你将长度参数设置为1024,那么在读取整个数据行之前,你必须调用stream_get_line
101次但是将读取整行,而不是一次调用该函数。
要直接回答您的问题,如果您传递较大的值,则不会为短回复带来任何额外开销。如何在引擎盖下工作真的取决于你正在读什么类型的流。对于具有较大length
值的网络流,如果需要很长时间才能从中读取length
数据,则在调用返回任何数据之前可能需要很长时间。网络,如果您在较小的块中阅读,您可能会在收到所有内容之前从网络中获取更多数据。