注意:该代码只能在命令模式下执行。不能在web调用请求导出。
开启五个进程,导出一百万数据,大概用了10秒的时间。一个进程负责导出215000的数据量。
直接看代码:
<?php
$start_time = microtime(TRUE);
$max_num = 5;
$process_pool = array();
for($i=1;$i<=$max_num;$i++){
//父子进程共享一个mysql连接。会使mysql失去连接
$process = new swoole_process(function(swoole_process $process){
//在每个子进程,单独连接
$conn = new PDO("mysql:host=localhost;dbname=patent", 'root', 'root');//连接数据库
$current = $process->read();//读取管道信息,用于计算导出的起点
$file = fopen('./excel' .$current . '.xls', 'w');//准备写入的文件
fwrite($file, "id\tname\tage\tscore\tcreate_time\t\n");
//查询数据
$offset = ($current - 1) * 215000;
$sql = "select * from dp_admin_test limit $offset,215000";
$stmt = $conn->query($sql);
$data = $stmt->fetchAll(2);
foreach($data as $k => $row){
//写入文件
fwrite($file, $row['id']."\t".$row['name']."\t".$row['age']."\t".$row['score']."\t".$row['create_time']."\n");
}
//断开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 = 'excel.zip';
$zip->open($zpFileName, \ZipArchive::CREATE); //打开压缩包
$zip->addFile('excel'.$i.'.xls'); //向压缩包中添加文件
$zip->close(); //关闭压缩包
}
``