IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Définir une racine "virtuel" d'une application web


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 209
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 209
    Par défaut Définir une racine "virtuel" d'une application web
    Bonjour,

    En gros, j'ai un serveur local ou je développe des sites web

    +root
    +root/site1/index.php
    +root/site2/index.php
    +root/site3/index.php
    etc..
    quand je passe l'un d'entre eux sur un serveur en prod, l'application web ne se trouva plus dans un dossier, mais à la racine
    +root/index.php
    etc...
    Ceci me cause un petit problème car j'ai besoin de définir la racine de mon site.
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SERVEUR[DOCUMENT_ROOT]
    ne vas pas m'aider car sur mon serveur local, il me retournera
    +root
    alors qu'en fait la racine de mon application web est
    +root/site1/
    . (alors que sur le serveur ca sera correct...)

    J'aimerais trouver une solution pour définir la racine de mon application, quelque soit ou il se trouve dans mon arborescence.

    Par exemple (je ne le ferais jamais) je pourrais avoir
    +root/mon_site/temp/site_de_mon_voisin/
    et créé un petit site de 4-5 pages dans le repertoie /site_de_mon_voisin/.

    Et j'aimerais définir que la racine de mon application soit dans ce dossier (site_de_mon_voisin).
    Ainsi je pourrais avoir deux variables.

    1. $root
    2. $root_de_mon_voisin

    Pourquoi?

    je souhaiterais avoir une varaible pour dire ou aller chercher les images ou les include.

    exemple:
    Dans le cas du site de mon voisin:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    incule($root_de_mon_voisin.'/include/head.php');
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="<?php echo $root_de_mon_voisin; ?>/images/logo.jpg" />
    Dans le cas de mon site:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    incule($root.'/include/head.php');
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="<?php echo $root; ?>/images/logo.jpg" />

    J'ai essayé donc divers truc comme
    $_SERVER['DOCUMENT_ROOT']
    ou dirname(__FILE__)

    mais dans les deux, ca n'a pas répondu à mon besoin

    Voyez vous une solution?

    Merci

  2. #2
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Les problèmes de chemins peut être un long débat, chacun y va de sa vision, donc quelque soit la méthode que tu utiliseras, ce sera ton choix.

    Après, ça dépend pour beaucoup de la façon dont est construit ton site.
    Il peut être par exemple impossible (ou plutôt compliqué) d'automatiser correctement tout ceci.

    Comme il existe plusieurs façons, je m'arrêterais à en citer 2, celles qui me semble les plus intéressantes.
    Mais il possible aussi d'exploiter les 2.

    En 1er, je dirais $_SERVEUR['DOCUMENT_ROOT'] peu ne pas retourner le bon chemin, il y a donc un risque.
    La fonction dirname() elle est théoriquement fiable.
    Si on regarde les gros projets comme Zend FrameWork, CakePhp, etc ... c'est cette dernière qui est utilisée.


    Exemple :
    dirname(__FILE__) renvoi : +root/site1/index.php
    dirname(dirname(__FILE__)) : +root/site1/ <- Celui ci te donne le bon chemin (théoriquement)

    Grâce à la façon ci-dessus, on peu par exemple définir ce chemin dans une constante ou autre variable, qu'on exploitera dans l'ensemble de son projet. C'est théoriquement la solution la plus automatisée, la plus portable.


    Une autre façon, c'est de se créer un fichier de configuration, (genre config.php) ou on définira soit même certains chemins clés de sont projet.
    Ce n'est donc pas totalement automatisé, et du coup moins portable.
    Cela reste néanmoins une solution très utilisée, car si on réfléchi bien, on sera de toute manière obligé de définir quelque part certaines config, comme le trio de la Bdd (hôte/username/password).
    Et surement bien d'autres, comme une adresse e-mail, serveur de mail, etc, et ...


    Donc comme je viens de l'évoquer, il faudra (quasi à coup sûr) avoir un fichier type config pour différentier son projet en local et celui sur le distant.
    Pour pouvoir différentier le coté local/distant, $_SERVER devrait contenir certaines infos pour ça, comme HTTP_HOST (ou autre), la constante PHP_OS aussi, etc ...
    On peu donc faire une alternative pour spécifier/définir l'un ou l'autre.


    Après, vient d'autre solutions qui peuvent être commune, comme intégrer quelques chemins clés (2 ou 3, par exemple) afin de simplifier son code avec la fonction set_include_path()
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set_include_path(get_include_path().PATH_SEPARATOR.CHEMIN_ROOT.PATH_SEPARATOR.CHEMIN_LIBRAIRIE);
    Au bout, ça permet d'utiliser des chemins relatifs, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    include('classes/UneClasse.php'); // qui se trouve dans : +root/site1/classes/UneClasse.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    incule($root_de_mon_voisin.'/include/head.php');
    <img src="<?php echo $root_de_mon_voisin; ?>/images/logo.jpg" />
    La je ne comprends pas pourquoi inclure un fichier qui ne serait pas dans le domaine ?
    Théoriquement, et par mesure de sécurité, Php ne permet pas d'inclure des fichiers d'un autre domaine que celui où il se trouve.
    (enfin, pas totalement, ça dépend si les 2 domaines sont sur la même machine ou pas, le même utilisateur en faite).

    Aussi, quel intérêt il y a t-il à vouloir inclure l'entête ou le logo d'un autre projet, d'un autre domaine ? (car site1 et site2 sont théoriquement 2 domaines différents, même si en local ils sont cote à cote)

    La, il y a peut être un souci d'organisation, non ?

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo