OpenDir()でディレクトリをスキャンするときにRealPath_Cache_Sizeを組み合わせることにより、実行効率を改善する方法は?
PHPでは、 OpenDir()は、ディレクトリを開き、ディレクトリハンドルを返すために使用される関数です。ディレクトリの内容を通過する必要がある場合、通常、 Opendir() 、 ReadDir() 、およびclosedir()を使用してそれを実現します。ただし、多数のファイルとディレクトリを扱う場合、プログラムの効率はボトルネックになる可能性があります。ディレクトリトラバーサルのパフォーマンスを向上させるために、PHPはConfiguration Option RealPath_Cache_Sizeを提供します。これにより、ディレクトリのスキャン時にOpenDir()の実行効率を効果的に改善できます。
RealPath_Cache_Sizeは、RealPathキャッシュサイズを構成するためのPHPの指令です。ファイルシステム操作のPHP、特にRealPath()関数呼び出しの場合、内部キャッシュを使用して、ファイルパスの真の絶対パスを保存して、ファイルパス解像度操作を複製しないようにします。プログラムがパス解像度操作を頻繁に実行する必要がある場合、 RealPath_Cache_Sizeのサイズを調整すると、不必要なパス解像度を減らすことができ、それによりプログラムのパフォーマンスが向上します。
PHPがパス解像度を実行すると、解析されたパスをキャッシュして、次回使用するとキャッシュされた結果を直接返すことができ、繰り返し解析を避けます。デフォルトでは、PHPのRealPath_Cache_Sizeは16KBに設定されています。これは、ほとんどの小さなプロジェクトで十分です。ただし、大規模なアプリケーションまたは複雑なファイルシステムでは、必要なすべてのパスを保存するには16kbのキャッシュでは不十分な場合があり、頻繁なパス解像度が発生し、パフォーマンスに影響します。
RealPath_cache_sizeを増やすことで、キャッシュ容量を増やし、パス解像度の数を減らすことができます。これにより、 Opendir()を使用して多数のファイルとディレクトリをスキャンすると効率が大幅に向上します。
実際の開発では、 OpenDir()を使用してディレクトリをスキャンすると、PHPは各ファイルとディレクトリのパスを解析します。ディレクトリに多数のファイルまたはサブディレクトリがあると仮定すると、PHPはこれらのパスを順番に解析します。パスがキャッシュにない場合、PHPはRealPath()を呼び出してパスを解析してキャッシュします。キャッシュサイズで十分でない場合、パス解像度が遅くなる可能性があり、 OpenDir()の実行速度に影響します。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 大きいものを設定します realpath_cache_size(例えば 64KB)</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'realpath_cache_size'</span></span><span>, </span><span><span class="hljs-string">'64K'</span></span><span>);
</span><span><span class="hljs-comment">// ディレクトリを開きます</span></span><span>
</span><span><span class="hljs-variable">$dir</span></span><span> = </span><span><span class="hljs-title function_ invoke__">opendir</span></span><span>(</span><span><span class="hljs-string">'/path/to/directory'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$dir</span></span><span>) {
</span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">readdir</span></span><span>(</span><span><span class="hljs-variable">$dir</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</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-title function_ invoke__">closedir</span></span><span>(</span><span><span class="hljs-variable">$dir</span></span><span>);
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
より大きなRealPath_Cache_Sizeを設定することにより、PHPはより多くのパス情報をキャッシュします。ディレクトリを通過すると、ディスクのパス解像度操作を減らすことができ、ディレクトリをスキャンする効率が向上します。
RealPath_Cache_Sizeのサイズは、PHP構成ファイルphp.iniで調整するか、コードのini_set()を使用して動的に設定できます。デフォルト値は16kbですが、多数のファイルパス解像度を必要とするアプリケーションの場合、この値は適切に増加することができます。特定のセットアップ方法は次のとおりです。
<span><span><span class="hljs-attr">realpath_cache_size</span></span><span> = </span><span><span class="hljs-number">64</span></span><span>K
</span></span>
<span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'realpath_cache_size'</span></span><span>, </span><span><span class="hljs-string">'64K'</span></span><span>);
</span></span>
RealPath_Cache_Sizeの増加はパフォーマンスを改善できることに注意する必要がありますが、より多くのメモリを占有するため、実際の条件に応じて調整する必要があります。
RealPath_Cache_Sizeの調整に加えて、 OpenDir()およびファイルスキャンを使用する場合、次の最適化戦略を考慮することもできます。
繰り返しのスキャンを避けてください:ディレクトリを通過するときは、すでに処理されたディレクトリまたはファイルの繰り返しスキャンを避けてください。スキャンされたディレクトリのキャッシュリストにより、不必要なスキャン操作を削減できます。
バッチ処理:ディレクトリに多数のファイルが含まれている場合、バッチでの処理を検討して、すべてのファイルを一度に読み取らないようにして、メモリ使用量が過剰になります。
非同期または並列処理:大規模ファイルスキャンタスクの場合、スキャン効率を改善するために非同期またはマルチスレッド技術( PTHREADや並列拡張など)を使用することを検討してください。
Opendir()とRealPath_Cache_Sizeの組み合わせは、PHPでディレクトリをスキャンすると、実行効率を大幅に改善できます。 RealPath_Cache_Sizeを適切に調整することにより、パス解像度の数を減らすことができ、それによりプログラムのパフォーマンスが向上します。ただし、この構成を調整するときは、メモリ消費を検討し、適切なキャッシュサイズを選択する必要があります。さらに、ディレクトリスキャン操作をさらに最適化して、全体的な実行効率を改善するための他の多くの方法があります。大規模なファイルとディレクトリを扱う場合、合理的な最適化戦略により、ファイルシステムの操作がより効率的かつ安定しています。