0

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

4

1 に答える 1

0

$driver_optionsあなたの実装を見ると、PDOStatement のセットが PDO オブジェクトのオプションのセットとは異なるように感じます。ドキュメントからは不明ですが、マニュアルページのメモはやや疑わしいようです。接続全体ではなく、ステートメントのみに影響するオプションのみを受け入れるようです。

だから、あなたがしたように、私はオプションを通常の方法で設定します:

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