使用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();  //关闭压缩包
}

你可能感兴趣的:(php,swoole)