Serveur local et noms de domaines, 2

Portrait de titouille

Après mon premier billet sur le sujet, comment configurer son serveur local avec les virtual hosts pour permettre d'atteindre les répertoires via de vrais nom de domaines, je n'était pas vraiment satisfait de ces paramétrages car si la racine de mon site est maintenant www.monsite.ch, alors je n'ai plus accès aux répertoires parents, lesquels peuvent contenir des classes génériques que je réutilise dans mes projets.

Bref. J'étais donc obligé de simuler entièrement mon install locale en install distante, avec toutes mes classes génériques et pear, le framework php que j'utilise, dupliquées dans un sous répertoire de mon site.

Après quelques recherches et de lectures sur le net, j'ai trouvé une info très intéressante qui permet de configurer des inclusions de chemin directement à partir du fichier httpd.conf d'apache.

en 2 mots : php_value et include_path.

include_path est une variable PHP qui peut être configurée dans le fichier php.ini, ou via les méthodes ini_set / ini_get. Cette variable peut lister des répertoires (chacun séparé par un point-virgule) qui seront automatiquement inclus dans le "path" de php. C'est à dire que chaque chemin inclus dans cette variable sera accessible directement, sans avoir à tapper le chemin complet du fichier.

Un exemple sera plus parlant :

1. mon répertoire de projet sous C:\server\www\sites\monsite

2. un répertoire contenant des classes que j'utilise dans mon projet sous C:\server\www\classes. Il contient une classe nommée DBLayer et une autre nommée Log.

j'applique un ini_set en php dans mon fichier de projet :

$initial_path = ini_get( 'include_path' );
 
ini_set( 'include_path', $initial_path . PATH_SEPARATOR . "C:\server\www\classes\" );

Dans ce même fichier de projet, j'aurai la possibilité maintenant d'inclure mes classes DBLayer et Log sans avoir besoin de faire :

include_once( "./../../classes/DBLayer.php" );
include_once( "./../../classes/Log.php" );

Maintenant que j'ai inclus le répertoire "classes" je peux atteindre les fichiers directement :

include_once( "DBLayer.php" );
include_once( "Log.php" );

Bref, première astuce, pour ce genre de choses, passer par le fichier php.ini, et si on n'y a pas accès (la plupart du temps c'est le cas...), utiliser un ini_set() pour régler le problème.

Mais cette première astuce, je la connaissais depuis longtemps, à mes tous débuts, j'avais été confronté à ce genre de problèmes avec la librairie PEAR, lors d'installation distante sur des serveurs ne possédant pas la librairie, il fallait passer par ini_set pour ajouter le chemin de PEAR dans le "path".

Et donc, depuis hier, après avoir joué avec les virtual hosts et reconfiguré mes sites locaux, ça me titillais de pouvoir inclure des chemins "externes" à la racine du site, mais je n'avais pas envisagé de le faire en php, je voulais trouver une solutions apache, et c'est fait.

Comme je l'ai cité plus haut, php_value et include_path, tels sont les 2 mots-clé de ce billet.

Dans la séquence d'un virtual hosts apache, il est possible de configurer la plupart des variables PHP, en utilisant "php_value" de la manière suivante :

<VirtualHost <a href="http://www.monsite.ch:80><br />
" title="80><br />
">www.monsite.ch:80><br />
</a>    DocumentRoot C:/server/www/sites/monsite
    ServerName <a href="http://www.monsite.ch<br />
" title="www.monsite.ch<br />
">www.monsite.ch<br />
</a>    ServerAlias <a href="http://www.monsite.ch" title="www.monsite.ch">www.monsite.ch</a> monsite.ch
    php_value include_path "./;C:/server\bin\php\includes;C:/server/www/classes/"
</VirtualHost>

Et comme je l'ai dit, il est possible de modifier toutes les variables serveur (valeurs modifiables du php_info) de cette manière.





c'est bien php_value mais ...

yo thierry
c'est bien php_value mais ... ça ne marche que dans le cas d'un php compilé en module d'apache dans le cas d'un cgi (ce qui peut arriver surtout lorsque php4 et php5 cohabitent sur le même serveur) et bin wallou Tongue

Merci pour l'info, bon a

Portrait de titouille

Merci pour l'info, bon a prendre et bon à savoir Wink