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