所以我有这张桌子:
mysql> DESCRIBE table;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(15) unsigned | NO | PRI | NULL | auto_increment |
| unid | char(9) | NO | UNI | NULL | |
| rs | varchar(255) | NO | | NULL | |
+-------+------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
其中包含数百万行:
mysql> SELECT COUNT(1) FROM table;
+----------+
| COUNT(1) |
+----------+
| 9435361 |
+----------+
1 row in set (0.00 sec)
我愿意导出.csv文件中的所有行(我正在使用Symfony2.6).此文件旨在存储在服务器上(未下载),稍后由PHP读取.
第一次尝试
我试图提出一个巨大的请求,一次选择所有(as per this blog post),但这有,尽管使用 – > iterate(),导致允许内存大小1073741824字节运行~9s后耗尽.
ini_set('memory_limit', '1024M');
ini_set('max_execution_time', -1);
$results = $em
->getRepository('MyBundle:Entity')
->createQueryBuilder('e')
->getQuery()
->iterate();
$handle = fopen('/path/to/csv/file/', 'w');
while (false !== ($row = $results->next())) {
fputcsv($handle, $row[0]->toArray());
$em->detach($row[0]);
}
fclose($handle);
第二次尝试
我检索了总行数,然后做了一个循环,使得相同数量的查询逐个检索行.但是在向.csv文件写入~260K行之后,PHP耗尽了内存并抛出了与上面相同的错误:允许的内存大小为1073741824字节.
ini_set('memory_limit', '1024M');
ini_set('max_execution_time', -1);
$total = (int) $em
->getRepository('MyBundle:Entity')
->countAll();
$csv = '/path/to/csv/file';
$handle = fopen($csv, 'w');
for($i = 1; $i < $total; $i++)
{
$entity = $em->getRepository('MyBundle:Entity')->findOneById($i);
fputcsv($handle, $entity->toArray());
$em->detach($entity);
}
fclose($handle);
第三次尝试
我曾想过使用exec()函数来运行导出表的MySQL命令行.但是,我的经理似乎不喜欢这个选项.
所以我自欺欺人地认为使用PHP将〜9.5M的行转储到.csv文件中甚至可能吗?还有其他我还没知道的方法吗?
感谢您对此的帮助.