gpt4 book ai didi

php - 如果unread_bytes == 0,则取消阻塞fread(),而不会使流连接超时

转载 作者:行者123 更新时间:2023-12-03 12:04:39 24 4
gpt4 key购买 nike

我正在尝试处理一个流,该流向我发送离散的信息包,但信息包之间的持续时间未知(例如,大约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),我需要它“放手”,并允许下面的代码检查时间并根据需要插入数据库。

TL; DR,我需要两个进程同时运行:
  • 捕获传入的流并处理数据
  • 密切注意时间,并定期将到达的任何数据(如果有)插入数据库中

  • 是否可以在开始fread()之前检查流中还有多少字节,如果unread_bytes'== 0,则继续执行while循环?还是可以在不中断整个流连接的情况下,专门对fread()设置某种超时?我很可能认为PHP不是执行我正在做的事情的正确语言,但这是我所知道的,所以我真的很想在可能的情况下使用它。

    最佳答案

    有时为他人提出问题是使您踏上正确道路的最佳途径,从而为自己找到正确的答案。我注意到stream_get_meta_data()数组中的一个元素是“blocking” =>“true”,由于我刚刚完成了有关取消阻止fread()的询问,这促使我寻找了一种将“blocking”设置为“false”的方法。

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

    (docs)

    关于php - 如果unread_bytes == 0,则取消阻塞fread(),而不会使流连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33061195/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com