Stream_set_write_buffer()関数を使用すると、ファイルストリームの書き込みバッファーを設定して、ファイルの書き込み効率を向上させることができます。最初にバッファーにデータを書き込むことにより、頻繁なI/O操作を減らすことで、特に大量のライティングが必要なシナリオでは、パフォーマンスを大幅に改善できます。
関数プロトタイプは次のとおりです。
<span><span><span class="hljs-title function_ invoke__">stream_set_write_buffer</span></span><span>(resource </span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$buffer</span></span><span>)
</span></span>
$ストリーム:ターゲットファイルストリームリソース。
$バッファ:バッファサイズ、バイト単位のユニット。 0が渡された場合、それはバッファが無効になっていることを意味します(ファイルに直接書き込みます)。
通常、書き込み操作データが比較的小さい場合は、より小さなバッファを選択できます。通常、大規模なバッファーは、大量のデータを書き込むためのパフォーマンスが向上します。
たとえば、時間あたりのデータを1時間(数十バイトなど)と記述すると、バッファーを0に設定するか、より少ない値を適切に設定する場合があります。逆に、データをバッチする必要がある場合、バッファを増やすと、頻繁にディスクI/O操作が妨げられません。
バッファサイズはメモリの使用に影響します。限られたメモリの場合、特大バッファーをセットアップすることはお勧めしません。したがって、サーバーの使用可能なメモリに応じてバッファサイズを適度に調整すると、パフォーマンスとメモリの使用量のバランスをとることができます。
ログファイルをすばやく記述する必要があるシナリオの場合、通常、より小さなバッファが使用されます。ログファイルは年代順に1つずつ記載されているため、大きすぎるバッファーを設定しすぎると遅延が発生する可能性があります。
大規模なファイル処理やデータベースのエクスポートなどの操作の場合、ディスクの書き込み頻度を減らすために、より大きなバッファーを使用することをお勧めします。特に、大規模なテキストファイルを扱う場合、バッファーを合理的に調整すると、効率を大幅に改善できます。
デフォルト:手動で設定したくない場合は、PHPのデフォルトバッファー動作に依存できます。 PHPは、システムのI/Oパフォーマンスに基づいてデフォルト値を自動的に選択します。これは、ほとんどのシナリオで十分です。
ステップバイステップのデバッグ:実際の開発環境では、さまざまなバッファーサイズを介してパフォーマンスチューニングを実行できます。複数の実験、異なるデータボリューム、サーバーの負荷を通じて、パフォーマンスに対する異なるバッファー設定の影響を比較でき、最後に最適な値が選択されます。
一般的な推奨事項:
ファイルの記述の場合、一般的に推奨されるバッファサイズは4kb〜64kbの間で、ほとんどのシナリオに適しています。
ログファイルの書き込みの場合は、バッファを小さいものに設定するか、バッファー(0バイト)を設定しないでください。
データベースのエクスポート、バッチデータ処理などの場合、通常1MBから8MBの間で大きなバッファーを使用することをお勧めします。これにより、バッチライティングの速度が大幅に向上します。
以下は、PHPでStream_set_write_buffer()を使用してファイルストリームのバッファサイズを設定する方法を示す一般的な例です。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// ファイルストリームを開きます</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>, </span><span><span class="hljs-string">'w'</span></span><span>);
</span><span><span class="hljs-comment">// バッファサイズをに設定します 8KB</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_set_write_buffer</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-number">8192</span></span><span>);
</span><span><span class="hljs-comment">// データを書き込みます</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-string">"これはテストコンテンツです\n"</span></span><span>);
</span><span><span class="hljs-comment">// ファイルストリームを閉じます</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
上記のコードでは、ファイルストリームの書き込みバッファーを8kbに設定すると、この値は実際のニーズに応じて調整できます。
Memory_get_usage()を介してメモリを監視します:テスト中、メモリの使用はMemory_get_usage()関数を介して監視して、大きすぎるバッファーを設定することによって引き起こされるメモリオーバーフローを回避できます。
書き込み操作の並行性の向上:場合によっては、複数の書き込み操作を並行して実行でき、合理的なバッファー設定で書き込み効率をさらに改善できます。
非同期書き込み:高い並行性シナリオでは、非同期書き込みまたはマルチスレッド/プロセス処理を考慮することができます。 PHP自体はマルチスレッドをサポートしていませんが、 PTHREADSを介して、またはCLIのPCNTL拡張機能と組み合わせて実装できます。
Stream_set_write_buffer()のバッファサイズを合理的に設定すると、ファイルライティングのパフォーマンスが大幅に向上する可能性があります。実際のアプリケーションでは、適切なバッファサイズを選択することは、システムメモリ、データの量、ファイルタイプなどの要因に基づいて包括的に考慮する必要があります。適切な調整により、メモリの無駄や頻繁なディスクの書き込みを避けながら、ファイル処理をより効率的にすることができます。