Finfoをファイルタイプ検出に使用する場合、PHPはFinfo_open()を介してリソースストリームを開きます。これは、ファイル情報に関連する内部リソースの管理に使用されます。 finfo_open()はファイルハンドルの開くのと同様に機能し、 finfo_close()はこのリソースを解放し、対応するファイルハンドルを閉じます。 finfo_close()が呼び出されない場合、PHPは関連するリソースをリリースできず、リソースの漏れを引き起こします。
PHPは、特定のメモリリソースを割り当てて、実行時にオープンファイル情報フローを処理する必要があります。 finfo_close()を呼び出すのを忘れた場合、これらのリソースは時間内にリリースされず、メモリが継続的に占有されます。特に高負荷アプリケーションでは、 finfo_open()やfinfo_file()などの関数が絶えず要求されているため、徐々にリソースが徐々に蓄積されます。
finfo_open()への各呼び出しは、ファイルハンドルを消費します。 FINFO_CLOSE()がハンドルをリリースするために呼び出されない場合、PHPはこれらのリソースをリサイクルできないため、システムで開かれたファイルハンドルの数が徐々に増加します。ファイルハンドルは有限リソースです。あまりにも多くのハンドルがリリースされていない場合、ファイルハンドル(ファイルの開く、データベース接続など)を必要とする他の操作が失敗する可能性があり、それによりシステム全体の安定性に影響します。
マルチスレッドまたは高電通貨のシナリオでは、 Finfo_Close()を呼び出すことを忘れても、システムのリソース割り当てがより激しくなり、パフォーマンスの劣化が生じる可能性があります。複数のリクエストがアプリケーションに同時にアクセスすると、リソースの漏れが新しいリクエストの通常の処理を妨げ、応答速度やタイムアウトが遅くなり、ユーザーエクスペリエンスに影響を与える可能性があります。
多数の未閉鎖ファイル情報がリソースを占めると、他の操作に必要なリソースが「ロック」または「使い果たされた」可能性があり、リソース競争が発生する可能性があります。この競争により、他のプログラムやスクリプトがスムーズに実行できず、アプリケーションの全体的な効率が低下する可能性があります。
finfo_close()を呼び出すことを忘れて引き起こされるパフォーマンスの問題を回避するために、次の測定値をとることができます。
最も重要なことは、 FINFO関連の関数を毎回使用した直後にFINFO_CLOSE()を呼び出すことです。これは、リソースの漏れを回避するための最も直接的で効果的な方法です。コードでは、次の方法を使用できます。
<span><span><span class="hljs-variable">$finfo</span></span><span> = </span><span><span class="hljs-title function_ invoke__">finfo_open</span></span><span>(FILEINFO_MIME_TYPE); </span><span><span class="hljs-comment">// 開けるfinfoリソース</span></span><span>
</span><span><span class="hljs-variable">$mimeType</span></span><span> = </span><span><span class="hljs-title function_ invoke__">finfo_file</span></span><span>(</span><span><span class="hljs-variable">$finfo</span></span><span>, </span><span><span class="hljs-string">'example.txt'</span></span><span>); </span><span><span class="hljs-comment">// ファイルを取得しますMIMEタイプ</span></span><span>
</span><span><span class="hljs-title function_ invoke__">finfo_close</span></span><span>(</span><span><span class="hljs-variable">$finfo</span></span><span>); </span><span><span class="hljs-comment">// 閉鎖finfoリソース</span></span><span>
</span></span>場合によっては、開発者はPHPの自動ごみ収集メカニズムを利用して、オブジェクトが使用されなくなったときにリサイクルされるようにすることができます。たとえば、 FINFOリソースをクラスにカプセル化し、クラスのデストラクタでfinfo_close()を呼び出すことができます。そのため、 finfo_close()を明示的に呼び出すのを忘れても、リソースが最終的にリサイクルされることを確認できます。
<span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">FileInfoHandler</span></span><span> {
</span><span><span class="hljs-keyword">private</span></span><span> </span><span><span class="hljs-variable">$finfo</span></span><span>;
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">__construct</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-variable language_">$this</span></span><span>->finfo = </span><span><span class="hljs-title function_ invoke__">finfo_open</span></span><span>(FILEINFO_MIME_TYPE);
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getMimeType</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$filePath</span></span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">finfo_file</span></span><span>(</span><span><span class="hljs-variable">$this</span></span><span>->finfo, </span><span><span class="hljs-variable">$filePath</span></span><span>);
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">__destruct</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">finfo_close</span></span><span>(</span><span><span class="hljs-variable">$this</span></span><span>->finfo); </span><span><span class="hljs-comment">// 在对象销毁时閉鎖リソース</span></span><span>
}
}
</span></span>特に頻繁に使用されるリソースの場合、コードレビューとパフォーマンステストを実行するときは、閉鎖されていないファイルストリームまたはデータベース接続について定期的に確認してください。静的分析ツールまたは通常のコード品質チェックを使用して、潜在的な問題を効果的に発見できます。
リソース管理を必要とするFINFOなどの機能を使用する場合、 Try-Catch-Finally Structureを使用すると、とにかくリソースが解放されます。例外がある場合でも、最終的なブロック内のfinfo_close()は引き続き実行されます。
<span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$finfo</span></span><span> = </span><span><span class="hljs-title function_ invoke__">finfo_open</span></span><span>(FILEINFO_MIME_TYPE);
</span><span><span class="hljs-variable">$mimeType</span></span><span> = </span><span><span class="hljs-title function_ invoke__">finfo_file</span></span><span>(</span><span><span class="hljs-variable">$finfo</span></span><span>, </span><span><span class="hljs-string">'example.txt'</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-comment">// 例外を処理します</span></span><span>
} </span><span><span class="hljs-keyword">finally</span></span><span> {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$finfo</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">finfo_close</span></span><span>(</span><span><span class="hljs-variable">$finfo</span></span><span>); </span><span><span class="hljs-comment">// 确保リソース被閉鎖</span></span><span>
}
}
</span></span>Finfo_close()関数を呼び出すのを忘れることは、一見マイナーなエラーですが、アプリケーションのパフォーマンスと安定性に大きな影響を与える可能性があります。優れたリソース管理習慣を維持し、リソースを自動的にリリースし、コードでのリソースの使用を定期的にチェックし、エラー処理メカニズムを合理的に使用することにより、開発者はこれによって引き起こされるパフォーマンスの問題を効果的に回避し、それによりPHPアプリケーションの全体的な効率と信頼性を改善できます。