Comment inclure des fichiers PHP nécessitant un chemin absolu ?

StackOverflow https://stackoverflow.com/questions/4369

  •  08-06-2019
  •  | 
  •  

Question

J'ai une structure de répertoires comme la suivante ;

script.php

inc/include1.php
inc/include2.php

objets/objet1.php
objets/objet2.php

savon/savon.php

Maintenant, j'utilise ces objets dans les deux script.php et /soap/soap.php, je pourrais les déplacer, mais je veux une structure de répertoires comme celle-là pour une raison spécifique.Lors de l'exécution script.php le chemin d'inclusion est inc/include.php et lors de l'exécution /soap/soap.php c'est ../inc, les chemins absolus fonctionnent, /mnt/webdev/[project name]/inc/include1.php... Mais c'est une mauvaise solution si je souhaite déplacer le répertoire vers un autre emplacement.

Existe-t-il donc un moyen d'utiliser des chemins relatifs ou un moyen de générer par programme le "/mnt/webdev/[project name]/"?

Était-ce utile?

La solution

Cela devrait fonctionner

$root = realpath($_SERVER["DOCUMENT_ROOT"]);

include "$root/inc/include1.php";

Modifier: amélioration ajoutée par aussieviking

Autres conseils

Vous pouvez utiliser des chemins relatifs.Essayer __FILE__.Il s'agit d'une constante PHP qui renvoie toujours le chemin/nom de fichier du script dans lequel il se trouve.Alors, dans soap.php, vous pourriez faire:

include dirname(__FILE__).'/../inc/include.php';

Le chemin complet et le nom de fichier du fichier.S'il est utilisé à l'intérieur d'un include, le nom du fichier inclus est renvoyé.Depuis PHP 4.0.2, __FILE__ Contient toujours un chemin absolu avec des liens symboliques résolus tandis que dans les versions plus anciennes, il contenait un chemin relatif dans certaines circonstances. (source)

Une autre solution serait de fixer un inclure le chemin dans votre httpd.conf ou un fichier .htaccess.

jettes un coup d'oeil à http://au.php.net/reserved.variables

Je pense que la variable que tu cherches est : $_SERVER["DOCUMENT_ROOT"]

Vous pouvez définir une constante avec le chemin d'accès au répertoire racine de votre projet, puis la placer au début du chemin.

Une autre façon de gérer cela, qui supprime tout besoin d'inclusion, consiste à utiliser le chargement automatique fonctionnalité.Inclure tout ce dont votre script a besoin « Juste au cas où » peut nuire aux performances.Si vos inclusions sont toutes des définitions de classe ou d'interface et que vous souhaitez les charger uniquement en cas de besoin, vous pouvez surcharger le fichier __autoload() fonction avec votre propre code pour trouver le fichier de classe approprié et le charger uniquement lorsqu'il est appelé.Voici l'exemple du manuel :

function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 

Tant que vous définissez vos variables include_path en conséquence, vous n'aurez plus jamais besoin d'inclure un fichier de classe.

Une autre option, liée à celle de Kevin, consiste à utiliser __FILE__, mais remplacez plutôt le nom du fichier php à l'intérieur :

<?php

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');

?>

Je l'utilise depuis un moment.Le seul problème c'est que parfois tu n'as pas $_SERVER['SCRIPT_NAME'], mais parfois il existe une autre variable similaire.

J'ai trouvé que cela fonctionnait très bien !

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

Utiliser:

<?php

function findRoot() {
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

include(findRoot() . 'Post.php');
$posts = getPosts(findRoot() . 'posts_content');

include(findRoot() . 'includes/head.php');

for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
    $posts[$i]->displayArticle();
}

include(findRoot() . 'includes/footer.php');

?>

Je pense que le meilleur moyen est de mettre vos inclusions dans votre chemin d'inclusion PHP.Il existe différentes manières de procéder en fonction de votre configuration.

Ensuite, vous pouvez simplement vous référer à

require_once 'inc1.php';

depuis l'intérieur de n'importe quel fichier, quel que soit son emplacement, que ce soit dans vos inclusions ou dans vos fichiers accessibles sur le Web, ou à n'importe quel niveau de sous-répertoires imbriqués.

Cela vous permet d'inclure vos fichiers en dehors de la racine du serveur Web, ce qui constitue une bonne pratique.

par exemple.

site directory
    html (web root)
        your web-accessible files
    includes
        your include files

Consultez également __autoload pour le chargement paresseux des fichiers de classe

http://www.google.com/search?q=setting+php+include+path

http://www.google.com/search?q=__autoload

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");

J'utilise cette ligne de code.Il remonte en "haut" de l'arborescence du site, puis va dans le fichier souhaité.

Par exemple, disons que j'ai cette arborescence de fichiers :

domaine.com/aaa/index.php
domaine.com/bbb/ccc/ddd/index.php
domaine.com/_resources/functions.php

Je peux inclure le fichier function.php où que je sois, simplement par copier-coller

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");

Si vous devez utiliser ce code plusieurs fois, vous pouvez créer une fonction qui renvoie le str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1)) partie.Ensuite, insérez simplement cette fonction dans le premier fichier que vous incluez.J'ai un fichier "initialize.php" que j'inclus tout en haut de chaque page php et qui contient cette fonction.La prochaine fois que je devrai inclure des fichiers, j'utiliserai simplement la fonction (nommée path_back):

require(path_back()."/_resources/another_php_file.php");

@Flubba, est-ce que cela me permet d'avoir des dossiers dans mon répertoire d'inclusion ?Les répertoires d'inclusion plats me donnent des cauchemars.car tout le répertoire des objets doit être dans le répertoire inc.

Ah oui, absolument.Ainsi par exemple, nous utilisons une seule couche de sous-dossiers, généralement :

require_once('library/string.class.php')

Vous devez faire attention à ne pas trop vous fier au chemin d'inclusion dans les sites à très fort trafic, car php doit parcourir le répertoire actuel, puis tous les répertoires sur le chemin d'inclusion afin de voir si votre fichier est là et cela peut ralentir les choses s'améliorent si vous vous faites marteler.

Ainsi, par exemple, si vous utilisez MVC, vous mettrez le chemin d'accès à votre répertoire d'application dans le chemin d'inclusion, puis spécifierez la référence aux éléments sous la forme

'model/user.class'
'controllers/front.php'

ou peu importe.

Mais d'une manière générale, cela vous permet simplement de travailler avec des chemins très courts dans votre PHP qui fonctionneront de n'importe où et c'est beaucoup plus facile à lire que tout ce malarkey racine du document realpath.

L'avantage de ces alternatives basées sur des scripts suggérées par d'autres est qu'elles fonctionnent n'importe où, même sur des boîtes partagées ;définir le chemin d'inclusion nécessite un peu plus de réflexion et d'efforts, mais comme je l'ai mentionné, vous permet de commencer à utiliser __autoload qui est tout simplement le plus cool.

Si vous souhaitez inclure un chemin spécifique dans la plupart des fichiers de votre application, créez une variable globale dans votre dossier racine.

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

Maintenant cette variable globale "CHEMIN_APPLICATION" peut être utilisé pour inclure tous les fichiers au lieu d'appeler realpath() à chaque fois que vous incluez un nouveau fichier.

EX:

include(APPLICATION_PATH ."/config/config.ini";

J'espère que cela aide ;-)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top