从PDO编写的语句中编写大型CSV文件

时间:2013-08-13 09:37:53

标签: php csv pdo

首先,已经有一个问题具有相同的标题(Writing a very large CSV file From DB output in PHP),但处理了一个单独的问题(file_put_contents的使用不当)。

我正在处理一个无缓冲的PDO预处理语句,逐行执行此操作,并将输出写入文件。但是,无论出于何种原因,PHP产生的内存超过500M。无论数据集有多大,我都不希望PHP使用任何东西。

<?php
$format = [
    'name' => function ($e) { return $e }
];

$sth = $db
    ->prepare("[..]");

$db
    ->execute([], [\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false]); // This is incorrect. $driver_options is a parameter of `prepare` method.


$output_file = tempnam('/tmp', 'mama-report-');

$fp = fopen($output_file, 'wb');

while ($row = $this->stmt->fetch(\PDO::FETCH_ASSOC)) { # line 49 (see comments)
    foreach ($format as $name => $f) {
        if (isset($row[$name])) {
            $row[$name] = $f($row[$name]);
        }
    }

    fputcsv($fp, array_values($row));
}

fclose($fp);

如何将已准备好的语句的已处理输出写入CSV?

1 个答案:

答案 0 :(得分:0)

查看您的实现我感觉PDOStatement的$driver_options集与PDO对象的选项集不同。从文档中不清楚,但the note on manual page对我来说有点怀疑。它似乎只接受只影响语句的选项,而不是整个连接。

所以,我会设置一个常用的选项,就像你做的那样:

$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, 0);