Comment fonctionne la résolution de chemin dans require_once?
J'ai écrit une application web en PHP, quand j'ai rencontré une drôle de situation. Pour illustrer mon problème, considérons une application web de cette structure:
/
index.php
f1/
f1.php
f2/
f2.php
Contenu de ces fichiers:
index.php:
<?php require_once("f1/f1.php"); ?>
f1.php:
<?php require_once("../f2/f2.php"); ?>
f2.php: vide
maintenant, quand j'essaie de l'ouvrir index.php dans mon navigateur, j'obtiens cette erreur:
Warning: require_once(../f2/f2.php) [function.require-once]:
failed to open stream: No such file or directory in /var/www/reqtest/f1/f1.php on line 2
Fatal error: require_once() [function.require]:
Failed opening required '../f2/f2.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/reqtest/f1/f1.php on line 2
Il est évident que je suis absent? comment inclure les chemins de travailler en PHP?
Avant que j'ai posé cette question, j'ai tenté d'explorer et de découvrir. J'ai mis en place un autre essai, comme suit:
/
index.php
f1/
f1.php
f2.php
index.php:
<?php require_once("f1/f1.php"); ?>
f1.php:
<?php require_once("f2.php"); ?>
f2.php: vide
À ma grande surprise (et la confusion totale), cela a bien marché!
Alors, quel est le secret derrière le chemin de la résolution?
PS j'ai vu cette questionmais il ne répond toujours pas le second cas que j'ai mentionné ici.
source d'informationauteur jrharshath
Vous devez vous connecter pour publier un commentaire.
Si vous incluez un autre fichier, le répertoire de travail reste à l'endroit où les fichiers.
Vos exemples fonctionnent comme prévu.
Edit: Le deuxième exemple fonctionne parce que . (répertoire réel) est dans votre path (voir votre message d'erreur).
Edit2:
Dans ton deuxième exemple, le point clé de votre intérêt est de cette ligne:
Au premier abord il va rechercher dans le travail actuel dir (
/var/www/req_path_test
), mais ne la trouve pas f2.php.Comme secours, il va essayer de trouver f2.php dans votre include_path (
'.:/usr/share/php:/usr/share/pear'
), en commençant par un '.' (ce qui est relatif à la réelle fichier, pas le y compris)." . /f2.php et pour le besoin de ne pas échouer.
Lorsque vous ouvrez index.php, de travail, dir est défini dans le dossier de ce fichier réside dans. Et à l'intérieur de insluded f1.php ce travail dir ne change pas.
Vous pouvez inclure des fichiers à l'aide de leurs chemins d'accès absolus, par rapport à l'actuel fichier inclus comme ceci:
Mais mieux envisager l'utilisation d'un chargeur automatique si ces fichiers contiennent des classes.
Normalement dans la vieille structure
<?php require_once("f2/f2.php"); ?>
au lieu de
<?php require_once("../f2/f2.php"); ?>
devrait fonctionner. Autant que je sache, php prend des chemins à partir du script initial
Il semble que votre serveur a l' open_basedir paramètre est activé dans la configuration de PHP. Cela rend impossible à comprendre (et ouverte) des fichiers dans des dossiers au-dessus de votre dans le répertoire de la structure (c'est à dire, vous ne pouvez pas utiliser ../aller dans le dossier de la structure).