Unblock fread() if unread_bytes == 0, 流连接不超时

Unblock fread() if unread_bytes == 0, without timing out stream connection

我正在尝试处理一个流,该流向我发送离散的信息包,但数据包之间的持续时间未知——比如说,大约 1-10 秒。我想使用 PHP 脚本下载流,但无论流是否向我发送数据,我也每 5 秒将到目前为止的所有数据保存到本地数据库。一些5秒间隔的记录会是空的;这种行为是预期和期望的,如果这是数据到达的方式。

我有一些代码,例如:

$fp = fopen($stream_url, 'r');
while (!feof($fp)) {

    // Download stream
    $stream_data .= fread($fp, 128);

    // Process $stream_data
    [...]

    // Check time and save data
    if ($time_since_last_insert == 5) {

        // Save to database
        [...]

        // Reset vars to be ready for new data in the next loop iteration
        $stream_data = '';

    }

}

根据我读过的 docs,fread() 会等待读取指定的字节数,然后再将任何内容返回给 $stream_data。但是如果当前没有要读取的字节(即 stream_get_meta_data() 表示 'unread_bytes' == 0),我需要它 "let go",并允许下面的代码检查时间并使数据库根据需要插入。

TL;DR,我需要两个进程同时运行:

  1. 捕获传入流并处理数据
  2. 关注时间并定期将到达的任何数据(如果有)插入数据库

是否可以在启动 fread() 之前检查流中剩余的字节数并在 unread_bytes' == 0 时继续我的 while 循环?或者是否可以在不中断整个流连接的情况下专门在 fread() 上设置某种超时?我对 PHP 不是我正在做的事情的正确语言的可能性持开放态度,但这是我所知道的,所以如果可能的话我真的很想使用它。

有时,为他人提出问题是让您走上正确轨道为自己找到正确答案的最佳方式。我注意到 stream_get_meta_data() 数组中的一个元素是 "blocking" => "true," 并且由于我刚刚问完有关解锁 fread() 的问题,这让我开始寻找一种方法将 "blocking" 设置为 "false."

使用:stream_set_blocking($fp, 0);,在fopen()之后,循环之前

(docs)