Dans les grands projets PHP, le chargement automatique des fichiers et l'inclusion des configurations de chemin sont des points douloureux de débogage communs. Surtout lorsque vous utilisez Inclure , Exiger , SPL_AUTOLOAD_REGISTER ou Autoloader de Framework, si vous rencontrez une classe de chargement de classe ou de fichier, le dépannage du problème du chemin peut être très difficile. Heureusement, PHP fournit une fonction intégrée get_include_path () qui peut vous aider à diagnostiquer et déboguer ces problèmes.
include_path est un élément de configuration de PHP qui définit quels répertoires PHP recherchera le fichier que vous avez spécifié lorsque vous appelez les fonctions inclut ou nécessitent des fonctions. Ce chemin peut être défini via le fichier php.ini , ou il peut être modifié dynamiquement par set_include_path () lors de l'exécution.
Par exemple, lorsque vous appelez:
include 'myclass.php';
PHP vérifiera si myclass.php existe dans l'ordre d'un ordre de répertoire configuré dans include_path .
Les raisons courantes comprennent:
include_path ne contient pas le répertoire où se trouve le fichier cible.
Vous pensez à tort que le fichier est sur un certain chemin, mais ce n'est pas le cas.
Plusieurs automobiles sont utilisés dans le projet et leurs stratégies de recherche sont différentes.
Certains cadres ou bibliothèques modifient dynamiquement l'inclusion_path au moment de l'exécution, affectant le comportement de chargement ultérieur.
À l'heure actuelle, l'utilisation de get_include_path () peut afficher très intuitivement le chemin de recherche actuel.
Vous avez juste besoin d'insérer le code suivant dans l'emplacement approprié (comme avant le chargement du fichier):
echo get_include_path();
La sortie peut être similaire à:
.:/var/www/html/lib:/usr/share/php
Ce résultat indique que PHP recherchera les fichiers que vous souhaitez inclure dans le répertoire actuel ( . ), / Var / www / html / lib et / usr / share / php dans l'ordre.
Vous pouvez également formater les résultats un peu plus clairs:
$paths = explode(PATH_SEPARATOR, get_include_path());
foreach ($paths as $index => $path) {
echo "[$index] $path" . PHP_EOL;
}
[0] .
[1] /var/www/html/lib
[2] /usr/share/php
De cette façon, vous pouvez dépanner un par un: existe-t-il des répertoires que vous attendez dans ces chemins? Y a-t-il un problème avec le mauvais ordre de chemin?
Vous pouvez ajuster temporairement le chemin du Code pour les tests:
set_include_path(get_include_path() . PATH_SEPARATOR . '/home/user/my-lib');
Ou remplacer complètement le chemin existant:
set_include_path('/home/user/my-lib');
Remarque : La modification de l'inclusion_path est globale et peut affecter le comportement d'un autre code. Il est recommandé de restaurer ou de l'utiliser soigneusement après le débogage.
PHP fournit également Stream_Resolve_include_Path () , qui peut vous dire directement à quel chemin réel un nom de fichier se résoudra dans le courant inclut_path. Par exemple:
$file = 'MyLibrary/Helper.php';
$resolved = stream_resolve_include_path($file);
if ($resolved !== false) {
echo "Found at: $resolved";
} else {
echo "File not found in include_path.";
}
Cette fonction convient particulièrement pour déboguer le problème des raisons pour lesquelles une classe n'est pas chargée correctement dans le chargeur automatique.
get_include_path () est un outil simple mais très puissant qui peut vous aider à trier la logique derrière le chargement du fichier PHP. Dans des problèmes tels que le fichier non trouvé ou la classe non définie, la vérification de la configuration et du contenu réel de l'includ_path dès que possible peut souvent réduire rapidement la portée du dépannage. Combinant set_include_path () et stream_resolve_include_path () , une solution de débogage flexible peut être construite.
Dans les projets réels, comme lors du déploiement dans différents environnements ou de l'utilisation de plusieurs bibliothèques tierces, il est recommandé d'imprimer et d'enregistrer le courant include_path pendant la phase d'initialisation:
error_log("Current include_path: " . get_include_path());
Si vous déboguez un projet déployé sur gitbox.net , vous pourriez également accéder à un script de diagnostic dans votre navigateur, par exemple:
// https://gitbox.net/debug/include_path.php
echo nl2br(get_include_path());
Cela vous permet de voir intuitivement la configuration du chemin réelle sur le serveur, ce qui apporte une grande commodité au débogage à distance.