Maison > développement back-end > tutoriel php > L'erreur que je continue de commettre en utilisant include_once au lieu de include

L'erreur que je continue de commettre en utilisant include_once au lieu de include

黄舟
Libérer: 2023-03-11 12:26:01
original
2277 Les gens l'ont consulté

J'utilise include_once depuis que j'ai appris la différence entre include et include_once. Je pense qu'il ne se charge qu'une seule fois et ne peut être chargé qu'une seule fois. évitez les chargements répétés. Et il semble que je ne puisse pas déterminer s'il a été chargé à plusieurs reprises. Il s'avère que j'avais tort depuis le début.

En fait, si le projet est développé par plusieurs personnes, include_once est préférable

séquence d'exécution include_once

Essayez d'analyser le chemin absolu du fichier. Si l'analyse réussit, vérifiez EG (inclus_files). S'il existe, retournez Rechercher, s'il existe, retournez, s'il n'existe pas, continuez à compiler le. file (compile_file

Récemment, nous avons eu plusieurs discussions sur la suppression de apc.include_once_override, et cet élément de configuration APC a toujours été Il n'a pas été bien implémenté.

Ici, Je voudrais partager avec vous les raisons de ce problème et quelques inspirations pour nous.

À propos de l'utilisation de include ou include_once (les éléments suivants incluent tous require_once), cette discussion a été longtemps, et la conclusion a toujours été d'essayer d'utiliser include au lieu de include_once. La raison la plus courante dans le passé était que include_once devait interroger la liste des fichiers chargés, confirmer si elle existe, puis la charger à nouveau.

Certes, cette raison est correcte, mais ce dont je veux parler aujourd'hui est une autre raison.

Nous savons que PHP détermine si le fichier est chargé nécessite le open_path du fichier, ce qui signifie, par exemple :

<?php
set_include_path("/tmp/:/tmp2/");
include_once("2.php");
?>
Copier après la connexion

Quand PHP voit include_once "2.php", il ne connaît pas l'emplacement réel du fichier. Quel est le chemin, il est impossible de juger s'il a été chargé à partir du fichier chargé. list, 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 juste similaire à la vérification de getcwd et du chemin du fichier. Donc, s'il s'agit d'un chemin relatif, ce ne sera généralement pas le cas. réussir). Si l'analyse est réussie, recherchez EG (include_files). S'il existe, cela signifie qu'il a été inclus et retournez-le. Sinon, ouvrez le fichier pour obtenir le chemin d'accès du fichier. Par exemple, l'exemple ci-dessus. le fichier existe dans "/tmp2/2.php".

Ensuite, après avoir obtenu le chemin_ouvert, PHP va dans la liste des fichiers chargés pour savoir s'il est inclus. Sinon, compilez directement, pas besoin 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. obtenez le chemin ouvert du fichier. )3. Prenez le chemin ouvert et recherchez-le dans EG (inclus_files) pour voir s'il existe, renvoyez-le. S'il n'existe pas, continuez. compile_file

Dans la plupart des cas, ce n'est pas un problème, mais le problème est 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 à partir du cache, évitant d'ouvrir le fichier lui-même et évitant

Cependant, lorsque vous utilisez include_once dans votre code, avant compile_file, PHP a déjà essayé d'ouvrir le fichier, puis est entré le fichier de compilation piraté par APC, donc une opération d'ouverture supplémentaire se produira. Pour résoudre ce problème, APC a introduit include_once_override. Lorsque include_once_override est activé, APC détournera le gestionnaire d'opcode ZEND_INCLUDE_OR_EVAL de PHP, déterminera le chemin absolu du fichier via stat et puis s'il s'avère qu'il n'est pas chargé, Réécrivez simplement 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, et il y aura des problèmes non définis, tels que :

<?php
set_include_path("/tmp");
function a($arg = array()) {include_once("b.php");}a();a();?>
Copier après la connexion

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

<?phpclass B {}?>
Copier après la connexion

Ensuite, lorsque apc.include_once_override est activé, l'accès continu vais-je j'ai obtenu l'erreur suivante :

Fatal error - include() : Cannot redeclare class
Copier après la connexion

(Postscript 2012-09-15 02:07:20 : J'ai corrigé ce bug APC : #63070)

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 nous-mêmes, et un fichier ne sera chargé qu'une seule fois. Nous pouvons également utiliser Chargez automatiquement pour ce faire

Si vous utilisez include_once, cela prouve seulement que vous n'avez aucune confiance en 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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal