まず、別の問題 (の不適切な使用) を扱っていますが、同じタイトルの質問 ( PHP で DB 出力から非常に大きな CSV ファイルを書き込む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 に書き込むにはどうすればよいですか?