PHP 导出csv,PHP导出csv 打包成zip

把数组处理成csv文件,并压缩成zip文件下载

zipfile('xxx.zip');

function zipfile($zipname) {
    
    $headers = ['1', '2', '3', '4'];

    $zip = new ZipArchive();
    $zip->open($zipname, ZipArchive::CREATE);
    
    // loop to create 3 csv files
    for ($i = 1; $i < 4; $i++) {
        $records = getRecord($i);
        $fd = putfile($zip, $headers, $records);
        // add the in-memory file to the archive, giving a name
        $zip->addFromString('file-'.$i.'.csv', stream_get_contents($fd));
        //close the file
        fclose($fd);
    }

    // close the archive
    $zip->close();

    header('Content-Type: application/zip');
    header('Content-disposition: attachment; filename='.$zipname);
    header('Content-Length: ' . filesize($zipname));
    readfile($zipname);

    // remove the zip archive
    // you could also use the temp file method above for this.
    unlink($zipname);

}

function getRecord($i) {
    $records1 = [
        ['111', '222', '333', '111'],
        ['111', '222', '333', '111'],
        ['111', '222', '333', '111'],
        ['111', '222', '333', '111'],
        ['111', '222', '333', '111'],
        ['111', '222', '333', '111'],
    ];

    $records2 = [
        ['111', '222', '333', '222'],
        ['111', '222', '333', '222'],
        ['111', '222', '333', '222'],
        ['111', '222', '333', '222'],
        ['111', '222', '333', '222'],
        ['111', '222', '333', '222'],
    ];

    $records3 = [
        ['111', '222', '333', '333'],
        ['111', '222', '333', '333'],
        ['111', '222', '333', '333'],
        ['111', '222', '333', '333'],
        ['111', '222', '333', '333'],
        ['111', '222', '333', '333'],
    ];
    $name = 'records' . $i;
    return $$name;
}

function putfile($zip, $headers, $records) {

    // create a temporary file
    $fd = fopen('php://temp/maxmemory:1048576', 'w');
    if (false === $fd) {
        die('Failed to create temporary file');
    }
    
    // write the data to csv
    fputcsv($fd, $headers);
    foreach($records as $record) {
        fputcsv($fd, $record);
    }

    // return to the start of the stream
    rewind($fd);

    return $fd;
}
直接输出csv文件 utf-8格式
function outputCsv($content) {

    $filename = 'xxx' . '_' . date('Ymd') . 'csv';
    header("Content-Disposition:attachment;filename=" . $filename);
    header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
    header('Expires:0');
    header('Pragma:public');
    header('Content-Encoding: UTF-8');
    header('Content-type: text/csv; charset=UTF-8');
    echo "\xEF\xBB\xBF"; // UTF-8 BOM

    echo $content;
整理一个包含csv头的数组导出成csv文件
public static function exportCsv($data)
    {
        if (count($data) === 0) {
            return '';
        }
        $file = fopen('php://memory', 'wb');
        $header = $data[0];
        $header_name = array_keys($header);
        $header_name_index = array_flip($header_name);
        $header_size = count($header);

        foreach ($data as $row) {
            $converted_row = [];
            for ($i = 0; $i < $header_size; $i++) {
                $converted_row[] = '';
            }
            foreach ($row as $key => $cell) {
                $index = -1;
                if (is_int($key) && $key >= 0 && $key < $header_size) {
                    $index = $key;
                } elseif (isset($header_name_index[$key])) {
                    $index = $header_name_index[$key];
                }
                if ($index >= 0) {
                    $converted_row[$index] = $cell;
                }
            }
            unset($key, $cell);
            ksort($converted_row, SORT_NUMERIC);
            fputcsv($file, $converted_row);
        }
        unset($row);

        fseek($file, 0, SEEK_SET);
        $content = '';
        $buffer_size = 8192;
        while (feof($file) === false) {
            $content .= fread($file, $buffer_size);
        }
        fclose($file);

        return $content;
    }

//输出csv文件,点击链接自动下载
outputCsv(self::exportCsv($data));

没法通过一次请求导出多个csv文件,只能通过zip打包多个csv文件,一次性下载。
大文件因为打开文件写入时间比较长,很容易timeout。
可以修改, 有一些作用。
nginx.conf

fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

php-fpm

request_terminate_timeout = 60s
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • 对于许多的从事数据智能开发的同僚来说,从库中提取出数据后进行数据整理并且导出csv文件的功能是很常见的,导出一个c...
    PeTu阅读 1,696评论 0 5
  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 10,214评论 5 124
  • 一、MemCache简介 session MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存...
    李伟铭MIng阅读 3,810评论 2 13
  • [toc] 在公司的网站上推荐使用 docker 容器来安装环境,一个项目一个 docker 容器。 、、 百度百...
    Mdvtrw阅读 1,495评论 0 1
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,744评论 0 10