我正在测试一个依赖于另一个基于流的库的PHP库。我的经验是与流相比低水平的插座,因此我有点不确定流是否足够灵活。
基本上,使用插座,我会编写一个缓冲循环,该循环检查了像n
这样的EOL字符的每个块的数据,例如So ...
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)之类的东西会导致较短响应的许多不必要的开销?
就文档的语句而言:
读取长度字节时,读数结束 通过结束指定(未包含在返回中 值)或在EOF上(以先到者为准)。
这并不意味着如果您的长度超过1,024甚至200,000,并且该线的长度比其余数据被截断或丢失的时间更长。这只是呼叫在此之前未达到eof/eol的最大数据。
因此,如果您的线长为102,500字节,并且将长度参数设置为1024,则必须在读取整个数据行之前,都必须调用stream_get_line
101次101次,但是整个行将为读取,只是一个呼叫函数。
要直接回答您的问题,如果您经过巨大的价值,就不会有任何额外的开销。在引擎盖下的工作方式确实取决于您正在阅读的流类型。对于具有较大length
值的网络流,可能需要很长时间才能在通话中返回任何数据,而从网络中读取length
数据需要很长时间,如果您在其中阅读较小的块,您可能会在收到所有内容之前从网络中获取更多数据。