4

あるファイルから別のファイルに簡単に書き込もうとしています。

$content=file_get_contents("C:\Users\Borut\Desktop\sql_PW1\mm_ads (1).sql");
file_put_contents("C:\Users\Borut\Desktop\sql_PW1\New", $content);

私が読んだファイルは約80Mの大きさで、phpのメモリ制限は128Mですが、エラーが発生します。

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 80739522 bytes)

それで、私が割り当てようとしているメモリが実際には小さいのに、メモリが使い果たされていますか?メモリ制限を増やすことでこれを機能させることができますが、なぜこの制限で機能しないのか知りたいです。

4

4 に答える 4

6

表示されるtried to allocate xxxx bytes量は、PHPのメモリ制限を超える量です。これは、追加の最大80MBを割り当てようとしたときに、128MBを使い果たしたことを意味します。

ファイルをメモリに収めることができたとしても、ファイルがそれほど大きくなることがわかっている場合は、///の組み合わせを使用する方がはるかに優れてfopenいます。freadfwritefclose

ただ、内容を読んで別のファイルに書き込むだけではないと思いますよね?それが必要な場合は、copy関数を使用するだけでよいためです。

于 2013-02-05T17:12:53.350 に答える
2

メモリを使い果たすことなく大きなファイルをダウンロードするには、次の機能を試してください。

function custom_put_contents($source_url='',$local_path=''){

    $time_limit = ini_get('max_execution_time');
    $memory_limit = ini_get('memory_limit');

    set_time_limit(0);
    ini_set('memory_limit', '-1');      

    $remote_contents=file_get_contents($source_url);
    $response=file_put_contents($local_path, $remote_contents);

    set_time_limit($time_limit);
    ini_set('memory_limit', $memory_limit); 

    return $response;
}

資力

134217728バイトの許容メモリサイズが使い果たされました

于 2015-03-24T15:30:39.510 に答える
1

ファイル全体をPHPにロードすると、メモリが非常に使い果たされる可能性があります。メモリに対して大きすぎるファイルを処理する必要がある場合は、一度に少しずつロードする必要があります。つまり、を使用することはできませんfile_get_contents()

ただし、ファイルをコピーするだけの場合は、ファイルをロードする必要はまったくありません。PHPはcopy()関数を提供します。まったくロードする必要なしに、ジョブは完了しました。

于 2013-02-05T17:21:58.270 に答える
1

最初の推測は、file_get_contents()が80Mのメモリを割り当てており、file_put_contents()がさらに80Mを割り当てようとしていることです。あなたは置くことを試みることができます

var_dump(memory_get_usage())

線の間。

このエラーメッセージは、実際に使用されているメモリの数を示していないことに注意してください。

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 80739522 bytes)

つまり、PHPが実際に100Mを使用していて、さらに80Mを割り当てようとしていることを意味している可能性があります。

そしてもちろん、そのような大きなファイルの場合は、fopen()fwrite()を使用して、ファイル全体を一度にメモリに入れることはできません。

また、これらのファイルをコピーしたいだけの場合は、単にcopy()を使用できます。

于 2013-02-05T17:15:28.373 に答える