【问题标题】:Overhead of large length in PHP stream_get_line()PHP stream_get_line() 中的大长度开销
【发布时间】:2015-07-22 10:28:42
【问题描述】:

我正在测试一个依赖于另一个基于流的库的 PHP 库。我的经验是与流相比级别较低的套接字,所以我有点不确定流是否足够灵活。

基本上,使用套接字,我会编写一个缓冲区循环来检查每个数据块中是否存在 EOL 字符,例如 \n,就像这样......

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 文档状态...

当读取到 length 个字节、找到由 ending 指定的字符串(不包含在返回值中)或 EOF 时(以先到者为准),读取结束。

...并且没有偏移参数,所以我不能以相同的方式使用它来获取余数。这意味着如果我不知道数据的长度,或者如果它不一致,我需要将length 设置得足够高以处理任何可能的数据长度。

这不是大问题,这似乎有效。问题是$length 值设置为512000 (500Kb) 之类的值是否会对较短的响应造成大量不必要的开销?

【问题讨论】:

    标签: php performance sockets stream


    【解决方案1】:

    就文档中的声明而言:

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

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

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

    要直接回答您的问题,如果您传递一个较大的值,那么简短的响应不会有任何额外的开销。它在幕后的工作方式实际上取决于您正在阅读的流类型。对于length 值较大的网络流,如果从网络读取length 数据需要很长时间,则调用可能需要很长时间才能返回任何数据,如果您正在阅读更小的块,您可能会在收到所有内容之前开始从网络获取更多数据。

    【讨论】:

    • 我明白了,我假设流会在第一遍就被丢弃,但没有意识到它基本上像 socket_read() 那样运行。那么这是否意味着在我的示例中,我基本上可以使用stream_get_line($connection,1024,"\n") 代替socket_read($connection,1024),而不是寻找\n,在第一个空的$buffer 上中断,或者$buffer 短于1024 字节?
    • .... 或者由于 stream_get_line() 自动从字符串中删除 EOL,它只会返回 null 结束 while 循环...
    • 您要读取什么类型的流? stream_get_line 在错误时返回 false(尝试在 EOF 之后读取),但如果没有更多数据可用,则会阻塞网络流,因此您可能需要一些应用程序逻辑来确定 EOF,具体取决于您尝试读取的内容
    • 这是来自 HandlerSocket 的网络流,所以我将不得不重新处理中断。关于如何做到这一点的任何建议?使用套接字,只需读取 EOL char 的响应并中断,但如果这将阻塞并在继续之前等待更多数据,我不知道如何打破它,除非我假设超时,这不会很理想。
    • 这很好地描述了检测数据是否继续存在的问题...linuxonly.nl/docs/41/130_The_problem_with_stream_get_line.html
    猜你喜欢
    • 2011-05-19
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2021-09-29
    • 2013-08-01
    • 1970-01-01
    • 2010-10-10
    • 2023-03-20
    相关资源
    最近更新 更多