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 :

gérer un niveau de répertoire supplémentaire en test par rapport à la production


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut gérer un niveau de répertoire supplémentaire en test par rapport à la production
    Bonjour,

    j'ai, comme la plupart des gens, 2 environnements : test et production. Mon souci est qu'en test, j'ai plusieurs sous-répertoires (V1, V2, V3...) ce qui n'existe pas en production. De ce fait, je ne sais pas gérer des liens qui seraient corrects en test puis en production.

    Exemple de mon problème :
    en test : C:/wamp/mon_projet/V3/un_fichier.php

    en production : http://xxx/un_fichier.php

    Si je veux faire dans un_fichier.php un lien vers un autre fichier à la racine, j'emploie $_SERVER['DOCUMENT_ROOT'] mais si en production, ça pointe bien sur http://xxx, en test, ça pointe sur C:/wamp/mon_projet donc le répertoire V3 est ignoré. Comment faire ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Bonsoir,

    as-tu pensé à la constante magique __DIR__ ?

    De manière plus générale, la doc de WAMP recommande de ne plus mettre ses projets en sous-répertoire de C:\wamp mais plutôt de créer des hôtes virtuels. Je t’explique comment faire si tu veux.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Watilin Voir le message
    Bonsoir,

    as-tu pensé à la constante magique __DIR__ ?
    Oui !
    Citation Envoyé par Watilin Voir le message
    De manière plus générale, la doc de WAMP recommande de ne plus mettre ses projets en sous-répertoire de C:\wamp mais plutôt de créer des hôtes virtuels. Je t’explique comment faire si tu veux.
    Je suis intéressé que tu m'expliques car même si après t'avoir lu, j'ai été voir sur Google, je n'ai pas tout compris. Je veux bien que tu m'expliques comment je devrais gérer mes différents sous-projets.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    C’est vrai que la doc de Wamp n’est pas très claire sur ce point.

    En gros tu vas modifier les fichiers suivants :
    • le httpd.conf d’Apache, accessible via le menu Wamp (clic gauche) > Apache ;
    • le hosts de Windows, qui se trouve par défaut à C:\Windows\system32\drivers\etc\hosts ;
    • les différents *.conf qui se trouveront dans le dossier vhosts sous la racine de Wamp (donc, par défaut, à C:\wamp\vhosts). Je ne sais plus si ce dossier existe par défaut, donc s’il n’est pas présent, crée-le.


    J’ai fait ma config il y a longtemps et j’ai un peu oublié comment sont les choses au départ. Pour info je suis sous WampServer 2.5.

    Avant tout, tu dois choisir un nom de domaine local, par exemple monsite.local. Le suffixe « .local » n’est pas obligatoire.

    La première étape est d’activer le module vhost_alias_module d’Apache, si ce n’est pas déjà fait, en éditant le httpd.conf. Cherche la ligne qui contient ce texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LoadModule vhost_alias_module modules/mod_vhost_alias.so
    et retire le # qui est devant. Puis tout en bas du fichier, vérifie que cette autre ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IncludeOptional "c:/wamp/vhosts/*"
    est bien présente et qu’elle n’est pas précédée d’un #.

    Ensuite, tu dois ajouter une redirection vers l’IP locale pour monsite.local. Pour ça tu dois ouvrir ton éditeur de texte en mode administrateur et éditer le hosts. Certains disent qu’ils ont des problèmes avec l’attribut lecture seule du fichier, perso ça ne m’est jamais arrivé. Au besoin, passe par un compte administrateur pour retirer l’attribut.

    Dans le hosts, ajoute cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    127.0.0.1       monsite.local
    Optionnellement tu peux également ajouter une ligne qui fait la même chose pour l’IPv6 :
    Enfin, crée un fichier monsite.local.conf dans le dossier vhosts de Wamp. Il devra contenir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <VirtualHost *:80>
        ServerName monsite.local
        DocumentRoot "lecteur:/chemin"
        <Directory "lecteur:/chemin/">
            Options Indexes FollowSymLinks MultiViews
            AllowOverride all
            Require local
        </Directory>
        ErrorLog "logs/monsite-error.log"
        CustomLog "logs/monsite-access.log" common
    </VirtualHost>
    Une fois que tu as bien géré ces trois fichiers, il ne reste plus qu’à relancer le service Apache, et ça devrait rouler. Tu auras accès à ton site local par http://monsite.local.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour Laurent,

    une solution plus simple () consiste à :

    1/ définir une CONSTANTE, SITE_URL_WWW :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //if( !defined('SITE_URL_WWW')) define('SITE_URL_WWW',	'www.mon-site.fr'); // en PRODUCTION
    if( !defined('SITE_URL_WWW')) 	define('SITE_URL_WWW',	'localhost:8080/mon-site-en-local-fr');  // !!!!! TEST en LOCAL !!!!
    if( !defined('SITE_URL_HTTP')) 	define('SITE_URL_HTTP',	'http://'.SITE_URL_WWW.'/');
    On peut alors l'utiliser pour les liens, images...
    Il suffit de la modifier quand on passe en production.

    2/ Utiliser pour les include() et autres require() la CONSTANTE MAGIQUE __DIR__ :
    ex.:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // CONFIGURATION : SITE
    	require_once(dirname(dirname(__DIR__)).'/_configuration/bootstrap_site_global.php');

    Un exemple : config. de mon module de News (constante NEWS_ROOT)

  6. #6
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Merci pour vos réponses, vues rapidement, mais pas eu le temps de tester...

    Jérôme, ta constante, tu me l'avais indiquée y a plusieurs années et depuis je m'en sers, sauf que là, je ne sais pas pourquoi, dans mon code, il y avait des include $_SERVER['DOCUMENT_ROOT']."/".PATH.'/connect_mysql.php'; au lieu de
    include SITE_URL_HTTP.'/connect_mysql.php';. Comme tu le vois, je l'utilise aussi pour les include plutôt que la constante _DIR_. Car à mon avis, si l'arborescence est différente en local et en production (comme dans mon cas), souci. Ton avis ?

    EDIT : je pense avoir un souci car dans mon code, j'ai :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(empty($bdd)){
    	include_once (SITE_URL_HTTP.'/new/class_MyPdo.php');
    }
    $bdd = new MyPdo("support_eis");
    et il me dit
    Class 'MyPdo' not found in C:\wamp\www\eis2\eis\connect_mysql.php on line 11
    et pourtant un echo placé dans class_MyPdo.php me prouve que le fichier est appelé...(La ligne 11 est la ligne 4 ci-dessus)
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Comme je n'arrive pas à supprimer l'erreur, j'ai quand même essayé l'include avec _DIR_ : include_once (_DIR_.'/new/class_MyPdo.php'); mais pour supprimer l'erreur, seul moyen : déclarer la classe dans le fichier. L'include ne lui plaît pas. Pourtant, class_MyPdo.php' :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    // MyPDO
     // ls : la classe MyPdo hérite de la classe PDO (extends)
    class MyPdo extends PDO {
     
    	protected $DB_NAME;
     
    	protected $HOST = "localhost";
     
    	protected $USER ="root";
     
    	protected $PASS ="";
     
     
     
    // ls : le constructeur de MyPdo appelle le constructeur de PDO en lui passant ses paramètres	
    	function __construct($db_name) {	
    	// ls : la variable $pdo_options, ça date de ma formation de 2012 
    	$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    	$pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;//important sur les configs récentes
    	$pdo_options[PDO::ATTR_DEFAULT_FETCH_MODE] = PDO::FETCH_OBJ;//pour le mode objet
    	$pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";//pour l'utf-8
     
    	$this->DB_NAME = $db_name;
    	parent::__construct('mysql:host=' . $this->HOST . ';dbname=' . $this->DB_NAME,$this->USER,$this->PASS,$pdo_options);  echo "MyPDO 30<br/>";
     
    	}
     
    }

    c'est quoi le souci ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Il faut bien que tu distingue deux choses qui sont différentes :

    1/ L'inclusion de scripts php avec les includes et les require qui demandent une adresse par rapport au serveur (et non pas une adresse commençant par http).

    Pour ce faire une solution pratique est d'inclure un fichier positionné à la racine de ton site qui définira des constantes et qui sera inclus dans tous tes scripts. On utilise la constante php __DIR__ et non pas $_SERVER['DOCUMENT_ROOT'] pour éviter les problèmes d'arborescence différente entre serveur local et serveur distant.

    En admenttant que tu appelles ce fichier "constantes.php", tu peux définir par exemple une constante __ROOT__
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    define('__ROOT__', __DIR__.DIRECTORY_SEPARATOR);
    Ainsi tous tes fichiers incluant le fichier "constantes.php" pourront utiliser cette constante __ROOT__ (définie avec __DIR__ qui indiquera donc dans ce cas la racine de ton site), pour créer des adresses de fichiers vers d'autres dossiers du site.
    Avec ce principe tu n'auras rien à modifier entre serveur local et serveur distant.

    2/ L'inclusion d'images ou de scripts javascript, fichiers css etc. inclus dans le html et dont l'adresse doit commencer par http ou sinon définis en relatif.
    Toujours dans ce fichier "constantes.php" tu peux ajouter par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    define('NOM_DOMAINE', 'http://nomdomaine.com/');
     
    define('LOCALHOST', 'http://localhost/nomdomaine_local/');
     
    // Base pour les url relatives (en admettant que $_SERVER['SERVER_NAME'] == 'localhost' en local)
    define('BASE_HREF', isset($_SERVER['SERVER_NAME']) && $_SERVER['SERVER_NAME'] == 'localhost' ? LOCALHOST : NOM_DOMAINE);
    Ainsi dans ton html il te suffira de définir base href pour avoir une base constante pour les adresses des fichiers images, css, javascript... quelque soit le positionnement de ton script pour peu qu'il inclue "constantes.php".

    en admenttant que ton script soit dans un dossier situé à la racine du site, ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?php
    // Si tu change ton fichier de place dans l'arborescence de ton site tu n'auras que l'adresse ci-dessous à modifier (éventuellement tu peux faire des tests avec file_exists pour tester différentes adresses possibles)
    require ("../constantes.php");
     
    // A partir de maintenant tu peux utiliser __ROOT__ pour cibler tes fichiers, par exemple
    require (__ROOT__.'Connexions/connexion_pdo.php');
     
    // ...
     
    // Et dans le html on définira base_href avec notre constante BASE_HREF
    ?>
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="UTF-8" />
    <title>titre</title>
    <meta name = "Description" content = "description page" />
    <meta name=viewport content="width=device-width, initial-scale=1">
    <!-- en définissant "base href" avec la constante définie dans "constantes.php", les adresses relatives seront identiques quelque soit le positionnement du fichier dans l'arborescence du site -->
    <base href="<?=BASE_HREF?>" />
    <link href = "Librairie/commun.css" rel="stylesheet"  type = "text/css" />
    <link rel="icon" type="image/png" href="PICS/favicon.png" />
    </head>
    <body>
    <div>
    <!-- en ayant défini "base href" avec la constante définie dans "constantes.php", les adresses relatives seront identiques quelque soit le positionnement du fichier dans l'arborescence du site -->
    <img src="PICS/mon_image.png">
    </div>
    </body>
    </html>
    Ce principe permet de n'avoir rien à modifier que l'on teste depuis un serveur local ou un depuis serveur distant

    Il permet aussi de passer un site en sous domaine d'un autre en modifiant simplement la constante NOM_DOMAINE (et éventuellement LOCALHOST) définies dans le fichier "constantes.php"

    Voilà tu as l'essentiel pour résoudre beaucoup de problèmes pour les chemins de fichiers.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par laurentSc Voir le message
    ...j'ai quand même essayé l'include avec _DIR_ : include_once (_DIR_.'/new/class_MyPdo.php');...
    • __DIR__ : 2 underscore avant, 2 après

  10. #10
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 385
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    C'est sûr que si on l'écrit correctement, c'est mieux...

    J'ai aussi intégré le truc de ABCIWEB pour que le fichier de config soit le même en prod et en local :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(!defined('SITE_URL_WWW_LOCAL')) define('SITE_URL_WWW_LOCAL','localhost:8081/mon-site-en-local-fr'); 
    if(!defined('SITE_URL_WWW_PROD')) define('SITE_URL_WWW_PROD','www.mon-site.fr'); 
     
    if( !defined('SITE_URL_WWW')) define('SITE_URL_WWW', (isset($_SERVER['SERVER_NAME']) && $_SERVER['SERVER_NAME'] == 'localhost') ? SITE_URL_WWW_LOCAL : SITE_URL_WWW_PROD );
    if( !defined('SITE_URL_HTTP'))	define('SITE_URL_HTTP',	'http://'.SITE_URL_WWW);

    chez moi, c'est 8081...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 04/05/2011, 12h37
  2. Où lier les répertoires supplémentaires
    Par kev42100 dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 21/08/2008, 11h43
  3. Répertoire de travail pollué par .aux, .log, .toc, et autres
    Par kloss dans le forum Editeurs / Outils
    Réponses: 8
    Dernier message: 12/06/2006, 10h31
  4. [JSTL] Test dynamique par rapport à un paramètre
    Par cosmos38240 dans le forum Taglibs
    Réponses: 3
    Dernier message: 21/12/2005, 20h05
  5. Réponses: 2
    Dernier message: 08/07/2005, 10h40

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