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