Maison  >  Article  >  développement back-end  >  Il est recommandé de ne pas utiliser include_once (require_once) autant que possible

Il est recommandé de ne pas utiliser include_once (require_once) autant que possible

黄舟
黄舟original
2017-06-25 11:54:592103parcourir

Cet article est une analyse détaillée et une introduction aux raisons pour lesquelles vous ne devriez pas utiliser (inclure/exiger)_une fois. Les amis dans le besoin peuvent se référer à

. À propos de l'utilisation d'Inclure ou de include_once (ci-après, tous incluent require_once) Cette discussion a été longue et la conclusion a toujours été qu'il s'agissait d'utiliser include au lieu de include_once dans le passé. , la raison la plus courante était que include_once doit interroger la liste des fichiers chargés, confirmer si elle existe, puis la charger à nouveau.

Certes, cette raison est correcte, mais de quoi je veux parler aujourd'hui c'est une autre raison.

Nous savons que pour déterminer si un fichier est chargé, PHP doit obtenir le open_path du fichier, ce qui signifie, par exemple :

Copier le code Le code est le suivant :

<?php
set_include_path
("/tmp/:/tmp2/");
include_once("2.php");
?>


Quand PHP voit include_once « 2.php », il ne sait pas quel est le chemin réel de ce fichier, et il ne peut pas le récupérer dans la liste des fichiers chargés pour déterminer s'il a été chargé, donc dans l'implémentation de include_once, il essaiera d'abord d'analyser le chemin réel du fichier (pour les fichiers ordinaires, cette analyse est similaire à la vérification de getcwd. et le chemin du fichier, donc s'il s'agit d'un chemin relatif, cela ne réussira généralement pas), si l'analyse réussit, recherchez EG (include_files) S'il existe, cela signifie qu'il a été inclus et renvoie Sinon, ouvrez le. fichier pour obtenir le chemin d'ouverture du fichier. Par exemple, dans l'exemple ci-dessus, ce fichier existe dans "/tmp2/2.php ».

Ensuite, après avoir obtenu le chemin d'ouverture, PHP accède à la liste des fichiers chargés. pour savoir s'il est inclus. S'il n'est pas inclus, compilez directement et il n'est plus nécessaire d'ouvrir le fichier.

1 Essayez d'analyser le chemin absolu du fichier. Si l'analyse réussit, vérifiez EG (inclus_files), retournez s'il existe et continuez s'il n'existe pas
2 Ouvrez le fichier et obtenez le chemin d'accès du fichier
3. chemin et recherchez-le dans EG (inclus_files) pour voir s'il existe, renvoyez-le. S'il n'existe pas, continuez
4 Compilez le fichier (compile_file)

Ceci. fonctionne dans la plupart des cas Ensuite, ce n'est pas un problème, mais le problème réside lorsque vous utilisez APC...

Lors de l'utilisation d'APC, APC détourne le pointeur compile_file du fichier compilé, obtenant ainsi le résultat de la compilation directement depuis le cache, évitant ainsi le besoin de L'ouverture du fichier lui-même évite l'appel système pour l'ouvrir.

Cependant, lorsque vous utilisez include_once dans le code, avant compile_file, PHP a déjà essayé d'ouvrir le fichier, puis est entré dans le processus détourné par APC.fichier de compilation, cela générera une opération d'ouverture supplémentaire. Pour résoudre ce problème, APC introduit include_once_override. Lorsque include_once_override est activé, APC détournera le gestionnaire d'opcode ZEND_INCLUDE_OR_EVAL et le déterminera via stat Le chemin absolu du. fichier, et s'il s'avère qu'il n'a pas été chargé, réécrivez l'opcode pour l'inclure et créez une solution délicate.

Mais, malheureusement, comme je l'ai dit, l'implémentation include_once_override d'APC n'a pas été bonne, donc elle le sera Il y a quelques problèmes non définis, tels que :

Copier le codeLe code est le suivant :

<?php
set_include_path("/tmp");
function a($arg = array()) {
    include_once("b.php");
}
a();
a();
?>


Ensuite, notre b.php est placé dans "/tmp/b.php", le contenu est le suivant :

Le code est le suivant :

<?php
  class B {}
?>


Puis quand apc.include_once_override est activé, l'accès continu aura l'erreur suivante :

Erreur fatale - include() : Impossible de redéclarer la classe b

En excluant ces facteurs techniques, j'ai toujours pensé que nous devrions utiliser include au lieu de include_once, car nous pouvons planifier complètement par vous-même et un fichier ne sera chargé qu'une seule fois. Vous pouvez également utiliser le chargement automatique pour ce faire

Si vous utilisez include_once, uniquement. prouve que vous n'avez aucun contrôle sur votre code.

Donc, je vous suggère de ne pas utiliser include_once

.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn