实际工作中,运营同学经常有获取数据的需求,写个脚本每次还需要手动执行导出数据给她们。有时候,需求在假期就很尴尬,提供一个让她们自己下载的接口是节省自己时间最好的办法。
// 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很慢。