$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(); //关闭压缩包
}
使用swoole多进程导出csv文件
最新推荐文章于 2021-12-04 15:31:32 发布