首先,已经有一个问题具有相同的标题(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?
答案 0 :(得分:0)
查看您的实现我感觉PDOStatement的$driver_options
集与PDO对象的选项集不同。从文档中不清楚,但the note on manual page对我来说有点怀疑。它似乎只接受只影响语句的选项,而不是整个连接。
所以,我会设置一个常用的选项,就像你做的那样:
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, 0);