15

大きなファイルをディスクに書き込む必要がある場合がある PHP スクリプトがあります。を使用file_put_contents()すると、ファイルが十分に大きい場合 (この場合は約 2 MB)、PHP スクリプトがメモリ不足になります (PHP 致命的なエラー: ######## バイトの許容メモリ サイズを使い果たしました)。メモリ制限を増やすことができることはわかっていますが、それは私にとって完全な解決策のようには思えません。もっと良い方法があるはずですよね?

PHPで大きなファイルをディスクに書き込む最良の方法は何ですか?

4

3 に答える 3

18

ソースファイルの一部と追加するものを入れる一時ファイルが必要になります。

$sp = fopen('source', 'r');
$op = fopen('tempfile', 'w');

while (!feof($sp)) {
   $buffer = fread($sp, 512);  // use a buffer of 512 bytes
   fwrite($op, $buffer);
}

// append new data
fwrite($op, $new_data);    

// close handles
fclose($op);
fclose($sp);

// make temporary file the new source
rename('tempfile', 'source');

そうすれば、 の内容全体sourceがメモリに読み込まれません。cURL を使用する場合、設定CURLOPT_RETURNTRANSFERを省略し、代わりに一時ファイルに書き込む出力バッファーを追加できます。

function write_temp($buffer) {
     global $handle;
     fwrite($handle, $buffer);
     return '';   // return EMPTY string, so nothing's internally buffered
}

$handle = fopen('tempfile', 'w');
ob_start('write_temp');

$curl_handle = curl_init('http://example.com/');
curl_setopt($curl_handle, CURLOPT_BUFFERSIZE, 512);
curl_exec($curl_handle);

ob_end_clean();
fclose($handle);

私はいつも明白なことを見逃しているようです。Marc が指摘したCURLOPT_FILEように、応答をディスクに直接書き込む必要があります。

于 2011-01-25T19:40:41.527 に答える
1

次のような関数を使用して、行ごとに(またはバイナリファイルの場合はパケットごとに)書き込みますfwrite()

于 2011-01-25T19:40:31.443 に答える
0

この答えを試してください:

    $file   = fopen("file.json", "w");

    $pieces = str_split($content, 1024 * 4);
    foreach ($pieces as $piece) {
        fwrite($file, $piece, strlen($piece));
    }

    fclose($file);
于 2015-11-04T09:22:33.307 に答える