我想知道我的 API 中是否有任何端点通过流发送数据块的时间间隔超过一分钟。 (例如,由于长时间运行的 sql 查询)
因此,我想在新数据发送到流时进行记录。 我使用 laravel,但我认为该解决方案与 php 流相当相关。
return \Illuminate\Support\Facades\Response::stream(function () {
$output = fopen('php://output', 'w');
SomeTable::query()
->where(...)
->chunk(1000)
->forEach($row => fputcsv($output, $row->toArray());
fclose($output);
}, 200, [
"Content-type" => "text/csv",
"Content-Disposition" => 'attachment; filename=stream.csv"',
"Pragma" => "no-cache",
"Cache-Control" => "must-revalidate, post-check=0, pre-check=0",
"Expires" => "0"
]);
}
此代码从数据库中检索 1000 个数据块,然后通过流发送这 1000 个数据。我想在我的代码库中找到此类查询花费超过 1 分钟的地方,以便我可以优化它们。
我对任何需要很长时间的查询不感兴趣,而只对那些在流上下文中使用的查询感兴趣。
因此,我正在寻找一种能够挂钩流并允许我在传输数据时运行一些代码的解决方案。
我知道我可以将代码添加到代码库的特定部分,但我正在寻找一种侦听所有流的解决方案,而无需在任何地方添加代码。
我设法通过 ob_start($callback) 来做到这一点
这允许我在缓冲区刷新时运行代码(= 数据发送到客户端)