PHP检索文本/事件流数据

ztyzrc3y  于 2023-04-10  发布在  PHP
关注(0)|答案(1)|浏览(113)

对于我的DIY项目,我想从第三方API检索数据,该API返回**'text/event-stream'**头。
因为连接没有关闭,所以我使用如下所示的超时:

$url='https://example.com/api/';
$ctx = stream_context_create(array('http'=>
    array(
        'timeout' => 1 // second
    )
));
$data = file_get_contents($url, false, $ctx);

除了超级hacky,它是缓慢的,感觉很糟糕。

是否可以只捕获事件流中的第一个数据元素(JSON)?

到目前为止,我还没有找到任何令人满意的解决方案,也许是因为我缺乏正确的词汇来搜索。
非常感谢帮助。

ryevplcw

ryevplcw1#

下面的代码可以让我读取单个事件。事件流似乎在每个事件之后都有一个双EOL。至少在我的情况下。我不确定是否所有此类流都是如此。
readEvent可以被多次调用来读取多个事件。

$handle = fopen($url, "rb");

function readEvent($handle) {
    $line = '';
    while (true) {
        $byte = fread($handle, 1);
        if ($line == '') {
            $timeStamp = DateTime::createFromFormat('U.u', microtime(true));
        }
        if ($byte === "\n") {
            fread($handle, 1); // skip one empty line (not sure if that is only necessary on the stream I am consuming)
            return ['timeStamp' => $timeStamp, 'event' => $line];
        }
        $line .= $byte;
    }
}

$event = readEvent($handle);
echo '1st event: ' . PHP_EOL;
echo '- received: ' . $event['timeStamp']->format("Y-m-d H:i:s.u") . PHP_EOL;
echo '- event: ' . $event['event'] . PHP_EOL;

fclose($handle);

相关问题