php stream_get_line()中的大长度的开销



我正在测试一个依赖于另一个基于流的库的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数据需要很长时间,如果您在其中阅读较小的块,您可能会在收到所有内容之前从网络中获取更多数据。

相关内容

  • 没有找到相关文章

最新更新