Lorsque vous utilisez FINFO pour la détection du type de fichier, PHP ouvre un flux de ressources via FINFO_OPEN () , qui est utilisé pour gérer les ressources internes liées aux informations du fichier. finfo_open () fonctionne similaire à l'ouverture d'une poignée de fichier, tandis que Finfo_close () publie cette ressource et ferme la poignée de fichier correspondante. Si finfo_close () n'est pas appelé, PHP ne pourra pas libérer les ressources pertinentes, provoquant une fuite de ressources.
PHP doit allouer certaines ressources de mémoire pour traiter le flux d'informations de fichier ouvert pendant l'exécution. Si vous oubliez d'appeler finfo_close () , ces ressources ne seront pas publiées dans le temps, ce qui entraînera la mémoire en permanence. Surtout dans les applications à haute charge, comme des fonctions telles que FinFo_Open () et FinFo_File () sont constamment demandées, les ressources non inférieures s'accumuleront progressivement, ce qui peut éventuellement entraîner l'épuisement de la mémoire, ce qui affectera les performances du serveur et peut même provoquer des accidents d'applications.
Chaque appel à finfo_open () consomme une poignée de fichier. Si finfo_close () n'est pas appelé pour libérer la poignée, PHP ne peut pas recycler ces ressources, ce qui entraîne une augmentation progressive du nombre de poignées de fichiers dans le système. Les poignées de fichiers sont des ressources finies. Si trop de poignées ne sont pas publiées, d'autres opérations qui nécessitent des poignées de fichiers (telles que les fichiers d'ouverture, les connexions de base de données, etc.) peuvent échouer, affectant ainsi la stabilité de l'ensemble du système.
Dans les scénarios multi-thread ou à haute monnaie, l'oubli d'appeler Finfo_close () peut faire en sorte que l'allocation des ressources du système devienne plus intense, entraînant une dégradation des performances. Lorsque plusieurs demandes accèdent à l'application en même temps, la fuite des ressources peut entraver le traitement normal des nouvelles demandes, provoquant une vitesse de réponse ou un délai d'expiration plus lent, affectant l'expérience utilisateur.
Lorsqu'un grand nombre de flux d'informations de fichiers non clos occupent les ressources, les ressources requises pour d'autres opérations peuvent être "verrouillées" ou "épuisées", provoquant une concurrence sur les ressources. Ce concours peut entraîner l'exécution de autres programmes ou scripts, réduisant l'efficacité globale de l'application.
Afin d'éviter les problèmes de performances causés en oubliant d'appeler Finfo_close () , les mesures suivantes peuvent être prises:
La chose la plus importante est d'appeler Finfo_close () immédiatement après avoir utilisé la fonction liée à FINFO à chaque fois. C'est le moyen le plus direct et le plus efficace d'éviter les fuites des ressources. Dans le code, la méthode suivante peut être utilisée:
<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">// Ouvrirfinforessource</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">// Obtenez le fichierMIMEtaper</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">// fermeturefinforessource</span></span><span>
</span></span>Dans certains cas, les développeurs peuvent tirer parti du mécanisme de collecte automatique des ordures de PHP pour s'assurer que les ressources des objets sont recyclées lorsqu'ils ne sont plus utilisés. Par exemple, vous pouvez encapsuler une ressource FINFO dans une classe et appeler finfo_close () dans le destructeur de la classe, de sorte que même si vous oubliez d'appeler explicitement finfo_close () , vous pouvez vous assurer que la ressource est finalement recyclée.
<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">// 在对象销毁时fermetureressource</span></span><span>
}
}
</span></span>Lorsque vous effectuez une révision du code et des tests de performances, en particulier pour les ressources fréquemment utilisées, vérifiez régulièrement les flux de fichiers non clos ou les connexions de base de données. Les problèmes potentiels peuvent être découverts efficacement en utilisant des outils d'analyse statique ou des contrôles de qualité de code ordinaires.
Lorsque vous utilisez des fonctions telles que FINFO qui nécessitent une gestion des ressources, l'utilisation de la structure TRY-Catch-finalement garantit que les ressources sont libérées de toute façon. Même en cas d'exception, le finfo_close () dans le bloc final sera toujours exécuté.
<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">// Gérer les exceptions</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">// 确保ressource被fermeture</span></span><span>
}
}
</span></span>Bien que l'oubli d'appeler la fonction finfo_close () soit une erreur apparemment mineure, elle peut avoir un impact énorme sur les performances et la stabilité de l'application. En maintenant de bonnes habitudes de gestion des ressources, en libérant automatiquement des ressources, en vérifiant régulièrement l'utilisation des ressources dans le code et en utilisant rationnellement les mécanismes de gestion des erreurs, les développeurs peuvent éviter efficacement les problèmes de performances causés par cela, améliorant ainsi l'efficacité globale et la fiabilité des applications PHP.