实际工作中,运营同学经常有获取数据的需求,写个脚本每次还需要手动执行导出数据给她们。有时候,需求在假期就很尴尬,提供一个让她们自己下载的接口是节省自己时间最好的办法。
// http://i.api.niliu.me/tool/index?id=1&flag=download
class Tool
{
public function indexAction
{
// 获取参数$id $flag
// 从db中获取数据$datas
$datas = $this->getData($id);
// 支持两种方式,接口返回;下载
if ($flag != 'download') {
if (!headers_sent()) {
header('Content-type: application/json; charset=utf-8', TRUE);
}
echo json_encode($result);
exit();
} else {
// 设置浏览器下载
header('Content-Description: File Transfer');
header('Content-type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
// 触发浏览器文件下载功能
header("Content-Disposition: attachment; filename=data" . $filename . '_' . date('Ymd') . '.csv');
// 输出第一行内容
echo 'uid' . "\r\n";
foreach ($datas as $data) {
echo $data['id'] . "\r\n";
ob_flush();
flush();
}
}
}
}
https://stackoverflow.com/questions/2832010/what-is-output-buffering
https://segmentfault.com/a/1190000003109808
文件下载
https://segmentfault.com/a/1190000010912097
https://www.jianshu.com/p/f10640cc3c2f
http://php.net/manual/zh/function.ob-get-level.php
问题:
0、php.ini中开启了ob有效吗?
output_buffering = 4096
1、ob_start();添加了cli中get_ob_level()返回0
2、浏览器下载,开启了ob应该更快,为啥还需要ob_flush;测试不加ob_flush很慢。
自动化数据导出:构建自助下载接口
这篇博客讨论了如何为运营团队创建一个自服务的数据下载接口,以避免手动导出数据的不便。通过PHP编写了一个脚本,该脚本可以根据$id$和$flag$参数从数据库获取数据。当$flag$为'download'时,设置HTTP头来触发浏览器的文件下载,输出CSV格式的数据。文章提到了输出缓冲(OB)在CLI和浏览器下载中的作用,以及为何在某些情况下需要使用ob_flush()来确保数据及时发送到浏览器。
639

被折叠的 条评论
为什么被折叠?



