Text

Partager une librairie PHP entre plusieurs sites

Sur un serveur en production, il peut nous arriver d’avoir plusieurs sites qui utilisent le même framework, ou le même fichier de configuration. De la même manière, les framework, comme dans mon cas Zend Framework, évoluent très rapidement et il peux être utile de gérer plusieurs versions sur le même serveur. Dans tous les cas, cette manipulation vous fera économiser de la place et facilitera vos mises à jours.

Commençons alors par placer dans un répertoire le ou les framework ainsi que les versions qui nous intéressent et incluons ce répertoire dans la configuration de php (votre fichier php.ini). Recherchez la ligne contenant la directive “include_path”. Celle si est commentée par défaut à l’aide d’un point-virgule (;). Elle décrit les différents répertoires contenant des fichiers sur lesquels nous voulons faire des include(). Décommentez alors la ligne en supprimant le point-virgule et adapter la description du chemin en fonction de l’endroit où vous avez placer vos librairies. Dans mon cas, cela donne:

include_path = “.:/var/www/library”

Pensez à conserver le “.” dans la liste des chemins à inclure afin de pouvoir inclure un fichier localement dans vos différentes applications php et redémarrez votre serveur http.

Dans le cas où nous avons plusieurs versions, il peut aussi être intéressant de simplifier le chemin d’accès à la dernière version stable. On peux alors utilise de manière toute simple utiliser les liens virtuels unix:

$ ln -s Zend_1.9.2 Zend

Pensez également à régler vos droits sur vos librairies:

# chown -R www-data:www-data /var/www/library

Enfin, voyons comment nous allons pouvoir utiliser cette librairie partagée coté applications. Je reprend alors mon exemple de Zend et le fichier bootstrap dans lequel nous avions l’habitude de re-écrire le path d’include de php (ici Zend se trouvais dans le ./library et ./application/models/ contient les modèles de notre application MVC):

set_include_path(‘.’ . PATH_SEPARATOR . ‘./library’ . PATH_SEPARATOR . ‘./application/models/’ . PATH_SEPARATOR . get_include_path());

Le path contenant le Zend Framework étant maintenant inclue par le “get_include_path()” nous pouvons supprimer le ./library des répertoires inclus.

Ensuite nous appelions notre framework avec la ligne:

require_once ‘Zend/Loader/Autoloader.php’;

Si vous avez suivit toutes les indications précédente et que vous laissez la ligne telle quelle, le site chargera ici la version courante de Zend Framework que j’ai décrit tout à l’heure par le lien logique unix. C’est ici que ça deviens intéressant et que nous pouvons préciser la version de Zend à utiliser.

Selon la manière donc vous avez nommé vos répertoires (dans mon cas Zend_x.y.z ou x.y.z correspond à la version du framework), vous pouvez alors appeler par exemple une version 1.6.2 de Zend dans une ancienne application.

require_once ‘Zend_1.6.2/Loader/Autoloader.php’;

Libre à vous d’adapter tout cela à vos propres conventions de nommage et de rangement.

Text

Installation de mod_python pour Apache sous Mac OS X

Bataille d’une soirée, j’ai passé pas mal de temps avant de réussir à faire redémarré mon Apache avec le chargement du module python.

L’erreur est pourtant simple:

mod_python.so: mach-o, but wrong architecture

Curieusement, il m’a alors fallu compiler un mod_python compatible avec toutes les architectures suportées par OS X (alors que je n’ai que des machines intel…)

Attention, pré-requis: vous devez avoir “gcc” et “make” installé sur votre machine. Si ce n’est pas le cas, installez les xcodestools.

Voici alors comment précéder:

-Tout d’abord, récupérez les dernières sources de mod_python sur le site du projet apache Actuellement, la dernière version étant la 3.3.1, l’url compléte des sources sera: http://www.apache.org/dist/httpd/modpython/mod_python-3.3.1.tgz (utilisez wget si vous l’avez installé!)

-Ouvrez un terminal est localisez l’endroit où ses sources ont été téléchargées (certainemant dans ~/Downloads)

-Décompressez l’archive:

% tar xvf mod_python-X.Y.Z.tgz

(notez que le X.Y.Z correspond à votre version) et entrez dans le dossier:

% cd mod_python-X.Y.Z

-Commençons par configurer les sources en précisant l’emplacement d’apxs

% ./configure —with-apxs=/usr/sbin/apxs

Laissons la machine mouliner et si tout ce passe bien elle devrai nous créer les bons Makefile.

C’est là que ça se complique puisque nous allons modifier directement le Makefile pour lui préciser les architectures à utiliser:

-Ouvrez donc le fichier src/MakeFile avec votre éditeur de text favori (vi est le mien!)

-Reperez la ligne LDFLAGS et ajoutez en fin de ligne:

-arch x86_64 -arch ppc -arch i386

Pour obtenir quelque chose du genre:

LDFLAGS= -Wl,-framework,Python -u _PyMac_Error -framework Python -Wl,-F. -arch x86_64 -arch ppc -arch i386

-Interessez vous maintenant à la ligne CFLAGS et ajoutez lui, en fin de ligne encore une fois:

-arch x86_64 -arch ppc -arch i386

Vous obtiendrez alors quelque chose qui ressemblera à ceci:

CFLAGS=$(OPT) $(INCLUDES) -arch x86_64 -arch ppc -arch i386

-Enfin dans la section “mod_python.so: $(SRCS)” (un peu plus bas), ajoutez les options:

-Wc,”-arch x86_64” -Wc,”-arch ppc” -Wc,”-arch i386”

après l’option -c de la ligne

$(APXS) $(INCLUDES) -c $(SRCS) $(LDFLAGS) $(LIBS)

pour obtenir un résultat proche de celui-ci:

$(APXS) $(INCLUDES) -c -Wc,”-arch x86_64” -Wc,”-arch ppc” -Wc,”-arch i386” $(SRCS) $(LDFLAGS) $(LIBS)

-Enregistrez vous modifications et quittez l’éditeur de texte pour revenir dans le dossier principal des sources.

Passons maintenant à la compilation de ce fameu module:

-Un petit

make

suvit d’un

sudo make install

devrai faire apparaitre un module nommé “mod_python.so” dans le dossier /usr/libexec/apache2

-Pour plus d’information sur notre module:

% file mod_python.so mod_python.so: Mach-O universal binary with 3 architectures mod_python.so (for architecture x86_64): Mach-O 64-bit bundle x86_64 mod_python.so (for architecture ppc7400): Mach-O bundle ppc mod_python.so (for architecture i386): Mach-O bundle i386

Enfin pour finir, activons le module dans Apache et voyons le résultat:

-Editez le fichier /etc/apache2/httpd.conf avec les droits administrateur et ajoutez la ligne

LoadModule python_module libexec/apache2/mod_python.so

(proprement parmi les autres LoadModule)

-Enfin pour tester le tout, ajoutez ces lignes à la toute fin du fichier:

<Location /mpinfo> SetHandler mod_python PythonInterpreter main_interpreter PythonHandler mod_python.testhandler </Location>

-Sauvegardez les modification, quittez l’éditeur de texte et relancez apache:

apachectl -k restart

Le final: Connectez vous maintenant à l’adresse http://localhost/mpinfo et vous remarquerez que votre serveur fonctionne bien avec les extensions python :)