使用swoole多进程导出csv文件

$start_time = microtime(TRUE);
$max_num = 5;           //进程数
$per_file = 100000;     //每个文件导出的记录数
$process_pool = array();
for($i=1;$i<=$max_num;$i++){
    //父子进程共享一个mysql连接。会使mysql失去连接
    $process = new swoole_process(function(swoole_process $process) use($per_file){
        //在每个子进程,单独连接
        $conn = new PDO("mysql:host=localhost;dbname=test", 'root', '123123');//连接数据库
        $conn->query('SET NAMES utf8');			
        $current = $process->read();//读取管道信息,用于计算导出的起点

        $file = fopen('./filename' .$current . '.csv', 'w');//准备写入的文件
        if (!is_resource($file)) {
            exit('Create CSV file failed');
        }
        fwrite($file,chr(0xEF).chr(0xBB).chr(0xBF));        //添加BOM头,防止乱码
        $head = ['id', 'name', 'wechat_no', 'fans_num', 'create_time'];
        fputcsv($file, $head);

        //查询数据
        $offset = ($current - 1) * $per_file;
        $sql = "select id,name,wechat_no,fans_num,create_time from test limit $offset,$per_file";
        $stmt = $conn->query($sql);
        $data  = $stmt->fetchAll(2);

        foreach($data as $k => $row){
            //写入文件
            $record = [
                $row['id'],
                $row['name'],
                $row['wechat_no'],
                $row['fans_num'],
                $row['create_time'],
            ];
            fputcsv($file, $record);
        }

        //断开mysql 连接,关闭文件
        $conn = null;
        fclose($file);

    },true);

    $pid = $process->start();
    $process->write($i);
    $process_pool[$pid] = $process;

}

// 等待子进程结束,回收资源
for($i = 1; $i <= $max_num; $i++){
    $ret = swoole_process::wait();
    unset($process_pool[$ret['pid']]);
    echo "子进程".$ret['pid']."退出\n";
}

$end_time = microtime(TRUE);
//计算总耗时
echo sprintf("use time:%.3f s\n", $end_time - $start_time);

//将导出的文件装入压缩包当中
for($i=1;$i<=$max_num;$i++){
    //装入压缩包中
    $zip = new \ZipArchive();
    $zpFileName = 'file.zip';
    $zip->open($zpFileName, \ZipArchive::CREATE);   //打开压缩包
    $zip->addFile('filename'.$i.'.csv');   //向压缩包中添加文件
    $zip->close();  //关闭压缩包
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值