PHP中的大长度开销stream_get_line()

时间:2015-05-11 19:12:08

标签: php performance sockets stream

我正在测试一个依赖于另一个基于流的库的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)会导致更短的响应带来大量不必要的开销吗?

1 个答案:

答案 0 :(得分:1)

至于文档中的陈述:

  

当读取长度字节时,读取结束,当字符串时   找到由结尾指定的(不包括在返回中)   价值),或EOF(以先到者为准)。

这并不意味着如果您传递1,024甚至200,000的长度并且该行长于该行,则其他数据将被截断或丢失。这只是在此之前未达到EOF / EOL时呼叫将返回的最大数据量。

因此,如果你有一个长度为102,500字节的行并且你将长度参数设置为1024,那么在读取整个数据行之前,你必须调用stream_get_line 101次但是将读取整行,而不是一次调用该函数。

要直接回答您的问题,如果您传递较大的值,则不会为短回复带来任何额外开销。如何在引擎盖下工作真的取决于你正在读什么类型的流。对于具有较大length值的网络流,如果需要很长时间才能从中读取length数据,则在调用返回任何数据之前可能需要很长时间。网络,如果您在较小的块中阅读,您可能会在收到所有内容之前从网络中获取更多数据。