0

首先,已经有一个标题相同的问题(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?

4

1 回答 1

0

查看您的实现,我感觉一组 PDOStatement$driver_options与 PDO 对象的一组选项不同。从文档中不清楚,但手册页上的注释对我来说有点可疑。它似乎只接受只影响语句的选项,而不是整个连接。

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

$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, 0);
于 2013-08-13T11:33:04.210 回答