SVN: Gestion des dépendances externes

août 05 2010 Published by Thibaut under Gestion de Projets, Svn, Web

Le versionning de vos projets de développement est une chose essentielle pour garantir la sécurité et la tenu à jour de vos sources entre développeurs.

Si l’intégralité des sources de votre projet peut être place sur un seul et unique dépôt, il arrive souvent que votre application soit dépendante d’un framework ou de quelques librairies importé d’un autre projet et souvent d’un autre dépôt SVN.

Il est donc relativement lourd est contraignant de devoir stocker et versionner les fichiers de ces sources externes qui ne seront de toute façon pas à jour par rapport au dépôt sur lequel vous l’aurez récupéré.
Prenons l’exemple d’un projet PHP utilisant Zend Framework.
Nous avons déjà mis en place la structure MVC du projet et nous l’avons importé vers notre dépôt SVN.

Nous souhaitons ajouter le Framework à jour dans le dossier /library à partir du dépôt officiel: http://framework.zend.com/svn/framework/standard/branches/release-1.9/library/

Commencez donc par vous placer dans le dossier /library en ligne de commande.

Pour déclarer notre dépôt externe nous allons utiliser la propriété « externals »  à l’aide de la fonction « propset » de SVN.

svn propset svn:externals « http://framework.zend.com/svn/framework/standard/branches/release-1.9/library/Zend Zend » .

Le point passé en dernier argument précise que nous déclarons cette propriété dans le dossier courant, ne l’oubliez surtout pas!

SVN nous répond alors: property ‘svn:externals’ set on ‘.’
Il ne nous reste plus qu’a faire un « svn up » pour mettre à jour la copie locale et récupérer ainsi une copie à jour du Framework sans que celui si soit stocké sur votre dépôt.

Votre projet sera maintenant à jour à chaque mise à jour et vous voilà affranchis de toute maintenance sur vos sources externes.

No responses yet

Loader PHP: chargez vos class automatiquement

oct 18 2009 Published by Thibaut under PHP, Web

Si par erreur (ou justement pas) vous vous mettez un jour à coder proprement en PHP, vous vous rendrez vite compte qu’avoir ces petites classes toute faite pour interroger une base de donnée ou parcer un fichier XML peut s’avérer très pratique. Une fois ces classes écrites une bonne fois pour toute, avec la gestion d’erreur qui va bien et tout et tout, il ne reste plus qu’a copier/coller celle dont on a besoin dans un dossier « Class » du projet en cours et on les appellera au besoin sur les pages concernées.

Mais voilà, trêve de plaisanteries, trois tonnes d’include en haut d’un fichier PHP ça va vite devenir très cochon et pas franchement lisible.

Nous allons voir ici comment utiliser la fonction __autoload() de PHP pour inclure automatiquement les fichiers contenant les classes que nous allons appeler.

Commençons par organiser un peux notre projet.

Créez un dossier à la racine du site qui va contenir toute les librairies de notre projet et créez dans celui ci un dossier « class » qui lui contiendra les classes de notre application.

Capture d’écran 2009-10-18 à 14.38.55

Créez maintenant un fichier nommé « Loader.php » à la racine du dossier « library » dans lequel nous allons placer le code suivant:

<?php

function __autoload($class_name) {

require_once ‘library/class/’ . $class_name . ‘.php’;

}

?>

On peut maintenant appeler ce fichier dans notre script d’origine, par exemple ici notre index.php

<?php

require_once(‘library/Loader.php’);

Ainsi une instanciassions de classe du type:

$sql_access = new db_access();

va automatiquement inclure le fichier « library/class/db_access.php » contenant la classe « db_access » et nous nous retrouvons directement avec une organisation du projet sous cette forme:

Capture d’écran 2009-10-18 à 23.00.58

Bienvenu dans le monde des projets bien organisés!

4 responses so far

WordPress et PHP 5.3

oct 04 2009 Published by Thibaut under Web

Après plusieurs tentatives d’installation (ou de migration) de WordPress sous un serveur PHP 5.3, je viens enfin de trouver la solution à ce qui semble être une incompatibilité due à une configuration non explicite de php.

L’erreur est simple, vous affichez votre site/blog sous wordpress et celui ci vous hurle dessus que les fonction strtotime() et date() ne peut répondre à au système car le timezone n’a pas été défini dans php.

Capture d’écran 2009-10-04 à 15.53.29

Reste donc a aller faire un tour dans votre php.ini, a rechercher « date.timezone =  » et à plus préciser « Europe/Paris » (oui ici on est en France monsieur!) en prenant soin de décommenter la ligne (retirez le « ; »)

Bon maintenant que j’ai downgrader mes serveurs en 5.2.10 je vais pouvoir remonter sur une 5.3!

One response so far

Partager une librairie PHP entre plusieurs sites

sept 07 2009 Published by Thibaut under PHP, Web, Zend Framework

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

Capture d’écran 2009-09-07 à 21.45.28
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.

No responses yet

Configuration d’Exim pour l’envoi externe

août 22 2009 Published by Thibaut under Linux, Web

La plupart des applications web que nous pouvons être amené à déployer sur un serveur web utilise des fonctions d’envoi de mails.

Afin de gérer soit même les files d’attentes, il peut alors être utile d’héberger soit même un serveur SMTP directement sur la machine qui héberge l’application. Nous allons donc voir comment configurer simplement Exim pour l’envoi de mails vers les domaines externes. Nous utiliserons une distribution Debian stable.

Commençons par installer Exim:

# aptitude install exim4

Exim va alors s’installer avec une configuration de base que nous allons modifier avec l’assistant fourni par exim4-config:

# dpkg-reconfigure exim4-config

Le premier écran vous expliquera le rôle de cet utilitaire, validez avec « Ok » pour passer à l’écran suivant.

Sur celui si, choisissez « Distribution direct par SMTP (site internet) ».

Ensuite sur l’écran suivant entrez le nom tel que vous l’avez défini dans votre configuration ou tel qu’il a été défini par votre hébergeur.

Deux écran plus loin, l’assistant va vous demander sur quelle adresse il va devoir accepter le courrier. Puisque nous sommes parti sur une configuration simple où le serveur d’applications (php par exemple) se trouve sur la même machine, nous utiliseront donc l’adresse 127.0.0.1 pour limiter les connections au serveur avec lui-même.

L’écran suivant nous demande alors de préciser sur quel autre nom le serveur doit accepter les mails. Nous pouvons ici lui repriser le nom DNS de notre machine.

Vient ensuite, la question des domaines à relayer. Nous l’avons déjà vu, nous n’acceptons les mails entrant que sur l’adresse de localhost: 127.0.0.1. Nous pouvons donc autoriser le transfert vers tous les domaines afin que les mails puissent sortir. Remplissez donc ce champ avec une étoile « * ».

Laissez la liste des machines à relayer vide car nous souhaitons que le serveur transmette lui même les mails sortants.

Deux écran plus loin, répondez « Non » à la proposition de minimiser les requêtes DNS, laissez la distribution du courrier au « format mbox dans /var/mail » et ne séparez pas la configuration dans plusieurs fichiers.

L’assistant va se fermer et va redémarrer Exim et vous pourrez tester sans problème le bon fonctionnement de votre MTA par exemple avec la fonction mail() de PHP.

No responses yet