通常の学習や開発では、大量のデータの読み書きにさらされることはめったにないため、突然そのような必要が生じた場合、file_get_contents などのいくつかの比較を実行することがあります
fread などを使用してファイルを読み込むことができますが、読み込むファイルが大きすぎると、大きなファイルの読み書きを行うときに問題が発生します。私のニーズを満たすため、インターネット上ですでに公開されている例に基づいてまとめブログを書きます。
それでは、具体的には何が起こるのでしょうか? まず、PHP の基本的な実装である file_get_contents と fread について説明しましょう
PHP のファイル読み取り関数、file_get_contents と fread について説明します。これら 2 つの関数は実際には同じです。 、それらはすべてシステム メモリに内容を読み取ります。
しかし、ファイルの内容を文字列に読み込むだけの場合は、file_get_contents() を使用してください。そのパフォーマンスは、多くの fread() よりもはるかに優れています。
それほど大きくないファイルを読み取る場合は問題ありませんが、大きなファイル (2GB のログなど) を読み取る場合、マシンのメモリが 4G しかない場合は、
ファイル全体を読み取ってから保存すると、文字列を指定すると、システムのメモリが爆発してフリーズする可能性があります。これは、メモリの一部がシステムの動作と他のプロセスの動作を維持するためにまだ使用されているためです。この場合、メモリが必要になります。一度に大量のコンテンツを読み込む場合は、この
メソッドを使用してそれを回避してください。
PHP ファイルの読み取り:
以下は、上記のメモリが爆発する現象を説明するために、オンラインで大きなファイルを読み取る例です。 。
_______________________________ 無敵の分割線_______________________________________________
要件は次のとおりです:
約 500 万行の約 1G のログ ファイルがあり、PHP を使用して最後の数行の内容を返します。
_______________________________ 無敵の分割線 _______________________________
上記の例は、最後の数行を読み取る例ですが、ファイルの内容の走査。これはファイル全体を読み取ることと同じですが、内容の最後の数行を読み取りたい場合は、fseek を直接使用して内容の一部を位置決めして読み取ることもできます。
大きなファイルの読み取りと書き込みの方法について説明します。
大きなファイルの読み取り:
(この場所は必要だと感じます IO のピーク サイズを減らすためにスリープ関数を追加しますが、それが正しいかどうかはわかりません。誰かが私にアドバイスをくれることを願っています)
別の方法は、fgets を使用して a を 1 行ずつ読み取ることです。 fgetss はファイル ポインターを使用するため、1 行の読み取りが比較的効率的です。
以下に、fgets を使用して大きなファイルを読み取り、ファイルの内容をエンコードする例を示します (UTF-8 -> GBK)。コードは次のとおりです。 大きなファイルの書き込み:
ファイルの書き込みはハードディスクに書き込まれるため、ファイルが一度に書き込まれる場合、大きなファイルの書き込みコストは大きなファイルの読み取りに比べてそれほど高くありません。