Dur Comme Faire

Aller au contenu | Aller au menu | Aller à la recherche

Christmas egg dans VLC

Pour célébrer Noël, le lecteur multimédia VLC s'est paré de ses plus beaux atours :

Ce genre de clin d'œil s'appelle un easter egg, ou œuf de Pâques dans notre langue. J'ai envie de qualifier celui-ci de Christmas egg (œuf de Noël).

mardi 29 décembre 2009 à 00h12 - Divers 1   0

Attention au contexte d'exécution des destructeurs

Lors d'un exercice en Licence Professionnelle Informatique Web Développeur à l'INSSET de Saint-Quentin, mes élèves ont constaté un comportement étrange avec le destructeur d'une classe. Voici un exemple minimal du problème :

<?php
class Exemple
{
	public function __destruct()
	{
		file_put_contents('log.txt', 'Test');
	}
}

$exemple = new Exemple();

Ce code ne pose a priori pas de problème et pourtant si vous l'exécutez avec Apache sur Unix vous risquez d'avoir des problèmes de droit d'écriture :

Warning: file_put_contents(log.txt) [function.file-put-contents]: failed to open stream: Permission denied in /var/www/test/destruct.php on line 6

En fait l'explication est aussi étonnante que simple et comme souvent on la trouve dans la documentation de PHP : lors de la phase de clôture d'un script, le contexte peut changer sur certains SAPI dont Apache.

Cela veux dire que notre instance étant détruite implicitement lors de la clôture du script, PHP ne va pas essayer de créer le fichier, dont le chemin est relatif, dans le même répertoire que le script mais dans un autre répertoire où il n'a pas forcément le droit d'écrire.

Pour contourner ce problème, il suffit soit de donner au fichier un chemin absolu pour le fichier, soit de détruire explicitement l'instance afin que cela se fasse avant la phase de clôture du script :

$exemple = null

ou

unset($exemple);

vendredi 11 décembre 2009 à 20h16 - PHP 7   0

Détection de la langue des visiteurs avec l'entête HTTP Accept-Language

Détecter automatiquement la langue d'un visiteur n'est pas chose aisée. Généralement, on utilise un système de géo-localisation pour déterminer le pays depuis lequel l'internaute navigue afin d'en déduire la langue.

Mais comment fait-on pour les pays avec plusieurs langues officielles comme la Belgique, le Canada ou la Suisse ? Comment distinguer également une personne située dans un pays dont elle ne parle pas la langue (touristes, travailleurs en déplacements, immigrés, etc.) ?

L'équipe de Flickr a résolu le problème en basant sa détection sur l'entête HTTP Accept-Language qu'envoient la plupart des navigateurs. Celle-ci indique au serveur les langues acceptées par l'internaute dans l'ordre de préférence. Il est donc ainsi aisé de servir le contenu du site dans la langue la plus appropriée sans devoir passer par des déductions plus ou moins approximatives.

Attention cependant à ne pas imposer vos déductions à vos visiteurs. Comme toute méthode, celle-ci a ses limites. Il est donc important de proposer un mécanisme aux visiteurs pour changer manuellement de langue.

mercredi 9 décembre 2009 à 22h05 - Développement Web 7   0

Dossier spécial PHP dans le numéro de décembre de Programmez !

Le numéro de décembre du magazine Programmez ! contient un dossier spécial PHP avec des articles par mes collègues Christophe Villeneuve et Damien Seguy ainsi qu'un article par votre serviteur sur l'industrialisation des développements PHP.

lundi 7 décembre 2009 à 12h02 - PHP 0   0

Revue de presse PHP du 06/12/09

Comme chaque fin de semaine, voici la revue de presse hebdomadaire pour vous faire découvrir ce qui se dit d'intéressant sur PHP. Il s’agit d’articles en français ou en anglais que j’aimerais partager avec vous.

Et cette semaine, vous ne trouverez pas un mais deux articles bonus qui n'ont pas directement de rapport avec PHP mais qui me semblent importants.

  • PHP Header(), Beyond Redirect
    PHP est un langage de programmation taillé pour le web. Cependant, les fondements même du web, à savoir HTTP ne sont pas toujours bien connus des développeurs. Cet article montre des exemples pratiques d'utilisation de la fonction header() pour aller plus loin qu'une simple redirection.
  • PHP 5.3 : Migation depuis PHP 5.2
    La nouvelle version mineure/majeure de PHP est sortie depuis maintenant un peu plus de trois mois. Comme toujours avec PHP, il n'y a globalement pas de modifications à faire dans le code de vos applications pour les faire tourner sur PHP 5.3.
    Je dis "globalement" car il arrive bien sûr que nos applications soient impactées par certains changements mineurs. Cet article les répertorie pour que la transition se fasse en douceur.
  • Refactoring PHP Code
    La refactorisation est l'un des outils clés à la disposition des développeurs. Elle consiste a réorganiser son code afin qu'il soit plus optimisé d'un point de vue performances et maintenabilité.
    Roy Ganor montre ici à l'aide d'exemples comment refactoriser du code PHP.
  • Distributing PHP processing with Gearman
    Gearman est un framework permettant le traitement distribué de tâches entre processus d'une même machine ou de machines différentes dans un cluster. Il permet notamment la parallélisation de traitements gourmands ou nombreux.
    Il est possible de lancer des traitements PHP avec Gearman comme l'explique en détail cet article.

Et voici les articles bonus de la semaine :

  • Comprehensible Code
    Programmer va bien au-delà de l'empilage mécanique de lignes de code. En plus d'être fonctionnel, le code doit être maintenable et donc pour cela il doit être facilement compréhensible par d'autres développeurs.
    Paul Jones, le créateur du framework Solar, rappelle quelques principes que l'on perd parfois de vue dans l'urgence du quotidien.
  • One Step at a Time
    On pense souvent que l'idéal est un rêve inaccessible. Le découragement devant l'ampleur de la tâche à accomplir nous fait souvent renoncer. Lorna Mitchell propose de combattre ce problème en avançant par petits pas atteignables tout en gardant l'objectif en ligne de mire.

dimanche 6 décembre 2009 à 17h14 - PHP 0   0

Revue de presse PHP du 10/11/09

Comme chaque semaine, voici la revue de presse hebdomadaire pour vous faire découvrir ce qui se dit d'intéressant sur PHP. Il s’agit d’articles en français ou en anglais que j’aimerais partager avec vous.

Et parce qu'il n'y a pas que PHP au monde, vous trouverez également un article important mais dans un domaine libre et n'ayant pas forcément de rapport avec PHP.

  • PHP Concepts: The Difference Between Functions & Language Constructs
    Samuel Folkes explique la différence subtile qui existe entre fonctions et constructions de langage.
  • WDependency
    WDependency est un outil en ligne de commande, développé par Olivier Hoareau, qui analyse une application PHP afin de déterminer les dépendences entre les différents éléments qui la composent. Une fois l'analyse faite, il est possible de l'exporter sous forme d'image ou de tableau PHP pour exploiter ces données ailleurs.
  • Exceptional PHP: Introduction to Exceptions
    Brandon Savage nous gratifie une fois de plus d'un excellent article. Il s'attaque cette fois aux exceptions, cette fonctionnalité introduite dans la version 5 de PHP et dont l'usage peine à être généralisé.
  • Refactoring PHP Code
    Voici une courte introduction au remaniement de code en PHP. Cette pratique consiste à simplifier et remodeler son code en vue de l'améliorer.
  • PHP 5.3 sous Windows, plus de nouveautés qu’on le croit!
    Romain Bourdon, un collègue mais surtout le créateur de Wamp Server revient sur aspect passé inaperçu de PHP 5.3 : l'amélioration significative de son support de Windows. Longtemps délaissée, la version pour ce système d'exploitation était très en retard en terme de qualité et d'industrialisation du processus de publication.

Et voici l'article bonus de la semaine :

Josianne et Robert sont dans un projet
Le blog d'Octo nous narre l'histoire de Josianne et Robert qui travaillent sur le même projet. Josianne est une analyste expérimentée et connaît bien la boutique. Robert connait bien l’environnement technique. Nous allons voir comment certaines méthodes de gestion même avec les bonnes personnes peuvent mener à des conflits et des échecs.

mardi 10 novembre 2009 à 21h11 - PHP 3   0

Ubuntu Karmic et PHP sont dans un bateau...

... et ça ne se passe visiblement pas très bien. Après les problèmes avec Zend Server et Zend Studio, voilà maintenant que c'est PHP et par ricochet PEAR qui ont des problèmes avec la dernière version d'Ubuntu.

Le problème vient de la librarie zlib. Certaines de ses fonctionnalités ne sont plus disponibles dans PHP ce qui provoque l'échec silencieux du package PEAR Archive_Tar, empêchant toute installation de package PEAR.

Heureusement, il existe un contournement. Il suffit d'ajouter l'argument "-Z" afin de demander l'installation de packages non compressés :

pear install -Z phpdocumentor

lundi 9 novembre 2009 à 13h02 - PHP 4   0

Revue de presse PHP du 02/11/09

Après une longue pause estivale (et un peu plus), voici le retour de la revue de presse hebdomadaire.

Le but est de vous faire découvrir ce qui se dit d'intéressant sur PHP. Il s’agit d’articles en français ou en anglais que j’aimerais partager avec vous. Et parce qu'il n'y a pas que PHP au monde, vous trouverez également un article important mais dans un domaine libre et n'ayant pas forcément de rapport avec PHP.

  • How to Create Totally Secure Cookies
    Sécuriser les cookies, et donc souvent par rebond les sessions, est essentiel mais encore faut-il bien comprendre les mécanismes mis en jeu.
    Le site Carsonified explique comment fonctionnent les cookies puis propose quelques moyens de sécuriser leur usage :
    • Limiter l'accès au cookie au strict minimum ;
    • Bien choisir les informations à y stocker ;
    • Protéger le cookie des XSS.
  • Symfony expliqué à ma maman
    Cette série de billets vise à expliquer à un néophyte ce qu'est le framework Symfony les rappels généraux s'appliquent à la plupart des frameworks PHP.
  • Why will Symfony 2.0 finally use PHP 5.3?
    Fabien Potencier, le créateur du framework Symfony, explique pourquoi après mûre réflexion la version 2.0 de ce framework nécessitera PHP 5.3.
    Ce choix est en phase avec ceux de Zend Framework et CakePHP et les éléments de sa réflexion font probablement écho aux interrogations de nombreux architectes PHP.
  • Avoiding Notices: When to Use isset() and empty()
    Si l'ont n'y prend pas garde, l'évaluation de conditions provoque parfois des notices. Pour éviter cela, il est recommandé d'utiliser les fonctions isset() ou empty(). Bien que souvent équivalentes, leur usage varie sensiblement et il est bon de bien comprendre leur fonctionnement pour les utiliser à bon escient.
  • Five Tips To Make Good Object-Oriented Code Better
    Si utiliser la programmation orientée objet est une bonne chose, bien l'utiliser est encore mieux. Brandon Savage nous propose cinq moyens d'améliorer son code avec au programme :
    • Utiliser beaucoup d'objets ;
    • Utiliser des interfaces pour rendre les API prévisibles ;
    • Utiliser l'injection de dépendance ;
    • Préférer la composition à l'héritage ;
    • Créer des classes faiblement couplées.

Et voici l'article bonus de la semaine :

Fake Rocks, Salami Commanders, and Just Enough to Start
On a probablement tous vécu un jour le syndrome de la feuille blanche. Cette peur de se lancer qui nous pousse souvent à choisir la facilité et à remettre au lendemain.
Lutter contre la procrastination, puisque c'est le nom de ce comportement, n'est pas facile et il n'y a pas de remède miracle. Cependant, un peu de méthode et beaucoup de courage peuvent en venir à bout.

lundi 2 novembre 2009 à 00h06 - PHP 1   0

Zend Studio et Ubuntu Karmic

Décidément la nouvelle mouture d'Ubuntu pose des problèmes aux produits Zend. Après Zend Server qui refuse de s'installer, voici que certains boutons sont inopérants dans la dernière version de Zend Studio.

Il existe là encore un contournement en attendant la correction du bug de GTK à l'origine du problème. Pour cela, il suffit de créer un script contenant les lignes suivantes et de l'utiliser pour lancer Zend Studio :

#!/bin/bash
export GDK_NATIVE_WINDOWS=1
<CHEMIN>/ZendStudio

Remplacez <CHEMIN> par le chemin vers votre exécutable Zend Studio et le tour est joué.

dimanche 1 novembre 2009 à 16h37 - PHP 3   0

Installation de Zend Server sur Ubuntu Karmic

Karmic, la nouvelle version d'Ubuntu est sortie comme prévu jeudi dernier. En essayant d'installer Zend Server dessus, j'ai eu la désagréable surprise de constater qu'un paquet nécessaire, "libkrb53", n'est plus disponible sur celle-ci.

Voici le genre de message d'erreur que l'on obtient :

The following packages have unmet dependencies:
  php-imap-zend-ce: Depends: libkrb53 (>= 1.4.2) but it is not installable
E: Broken packages

En fait, ce paquet a été séparé en plusieurs nouveaux paquets : libkrb5-3, libgssapi-krb5-2, libk5crypto3 et libkrb5support0. En attendant qu'Ubuntu ou Zend corrige ce problème, il est possible de le contourner en créant soit-même un paquet transitionnel faisant office d'alias pour ces nouveaux paquets.

  • Passer en root : sudo -i
  • Créer le fichier libkrb53_fake.txt et y ajouter les lignes suivantes :
Package: libkrb53
Version: 1.6.dfsg.2+fake1
Depends: libkrb5-3, libgssapi-krb5-2, libk5crypto3, libkrb5support0
  • Construire le paquet : equivs-build libkrb53_fake.txt (Il vous faudra peut-être installer le paquet "equivs" pour cela)
  • Installer le paquet créé : dpkg -i libkrb53_1.6.dfsg.2+fake1_all.deb

Il ne vous reste plus qu'à relancer l'installation de Zend Server.

samedi 31 octobre 2009 à 17h30 - PHP 1   0

Annonce de l'agenda du Forum PHP 2009

Le programme du Forum PHP 2009 a été annoncé il y a quelques mais sans les horaires. Cet oubli est à présent réparé. L'agenda du forum est disponible sur le site de l'AFUP.

J'y serai et vous, y serez vous ?

samedi 3 octobre 2009 à 16h23 - PHP 3   0

Livre blanc "Industrialisation PHP"

Après quelques jours d'efforts pour tout boucler, Alter Way vient de publier le premier livre blanc sur l'industrialisation des développements PHP. Ce livre blanc a été écrit par Damien Seguy, figure du monde PHP, et moi-même.

En près de 15 ans, PHP a conquis la plupart des entreprises. Au début utilisé pour des projets annexes, il est aujourd'hui au cœur du SI. Les projets se complexifient, les délais se raccourcissent : il est temps d'industrialiser les processus de développement.

Ce Livre Blanc dresse un état de l'art des outils et méthodes qui permettent aujourd'hui d'industrialiser ses développements PHP.

Voici le sommaire complet :

  • 1 Introduction
  • 2 Maîtriser le cycle de vie d'un projet PHP
  • 3 Pratiques actuelles
    • 3.1 Faire faire un audit par un expert
    • 3.2 Formation des équipes
    • 3.3 Employer une convention de programmation
    • 3.4 Utiliser un dépôt de code
    • 3.5 Utiliser un framework
    • 3.6 Adopter un IDE de développement
  • 4 Outils et méthodes avancées
    • 4.1 Tests d'application Web
    • 4.2 Intégration continue
    • 4.3 Déploiement automatique
    • 4.4 Analyse statique
    • 4.5 Outils de conception
    • 4.6 Méthodes de programmation
    • 4.7 Maîtrise de la qualité du code
    • 4.8 Implication des utilisateurs
  • 5 Une nouvelle frontière
    • 5.1 PHP n'a pas encore exprimé son identité
    • 5.2 PHP n'exploite pas encore ses capacités de collaboration
    • 5.3 Des idées à explorer
    • 5.4 La communauté est un atout majeur
    • 5.5 Les développeurs vont gagner en discipline
  • 6 Bibliographie
  • 7 Licence et diffusion
    • 7.1 OpenContent License (OPL)
    • 7.2 Diffusion

Pour le télécharger, il suffit de vous rendre sur le site Alter Way.

Enfin ce livre blanc est diffusé sous licence OpenContent. Nous vous encourageons donc à le diffuser le plus possible pour porter la bonne parole dans tout le monde PHP voire au delà !

jeudi 1 octobre 2009 à 10h15 - PHP 7   0

Les Fatals Picards dans mes archives photographiques

En faisant du tri dans mes photos, j'ai retrouvé cette photo prise avec les Fatals Picards et des amis, le 31 mai 2003 dans un bar un peu miteux de Saint Quentin, en Picardie.

Chacun à fait un sacré chemin depuis, que ce soit le groupe ou nous.

dimanche 27 septembre 2009 à 14h01 - Musique 4   0

Le programme du Forum PHP 2009 est annoncé

L'édition 2009 du Forum PHP se tiendra les 12 et 13 novembre à la Cité des sciences de la Villette, à Paris.

Le programme vient d'être dévoilé et il fait la part belle au duo PHP / MySQL. Cet évènement sera d'ailleurs organisé en collaboration avec Le MUG, l’association francophone des utilisateurs de MySQL.

Voici quelques conférences qui ont particulièrement retenu mon attention :

  • Oui ! PHP est industriel ! (Damien Seguy et Olivier Hoareau)
  • Flex et PHP (Michael Chaize)
  • Au secours, ma base de données fait ramer mon application ! (Stéphane Combaudon)
  • Optimisation des performances Magento avec Zend Server (Alban Hanry, Philippe Humeau)
  • Apache pour le développeur PHP (Julien Pauli)
  • MariaDB, the future of MySQL (Michael Widenius)

jeudi 24 septembre 2009 à 21h31 - PHP 3   0

L'Agile Tour passera encore par Lille cette année

Cette année encore, l'Agile Tour passera par Lille. L'an passé l'événement avait attiré environ 80 participants, couvrant une large palette des métiers du logiciel en région.

Les commentaires sur la conférence ont été unanimement positifs grâce essentiellement à la qualité du contenu et donc des intervenants. C'est d'autant plus un tour de force qu'il s'agissait de la première édition.

Cette année, Agile Tour Lille 2009 se déroulera le 30 octobre, de 13h30 à 18h30 à Euratechnologies. A partir de 19h30, un OpenSpace permettra de poursuivre les échanges dans un cadre moins formel et plus interactif.

Toutes les infos sont disponibles sur le site où vous pouvez dès à présent vous inscrire.

lundi 21 septembre 2009 à 07h54 - Développement Web 0   0

Gestion du code mort

Olivier Hoareau évoque dans son dernier billet la gestion du code mort. C'est un sujet très intéressant car il montre que dans un domaine technique comme le développement, certaines notions très humaines et donc irrationnelles ont parfois une grande importance.

Il y a effectivement un attachement quasi affectif du développeur à son code. Une fois le code écrit on cherche souvent à toute force à lui trouver une utilité.

Comme Olivier, je pense qu'il faut savoir "jeter" son code s'il n'est plus pertinent. J'utilise des guillemets car un code conçu reste souvent en mémoire même s'il n'est finalement pas utilisé. Par ailleurs, si le code est suffisamment bon, bien qu'inadapté à la situation, on prendra soin de le stocker quelque part en vue d'une autre utilisation.

Pour résumer, je pense qu'il ne faut pas confondre dépôt et galerie de code. Le premier est dédié à une application précise tandis que le second est un recueil de morceaux de code dont on pense qu'ils seront probablement utiles plus tard mais sans en connaître l'usage que l'on en fera.

lundi 14 septembre 2009 à 19h14 - PHP 3   0

Zend Server : Permettre l'accès à distance à phpMyAdmin

Je teste Zend Server depuis quelques semaines. Mes premières impressions sont plutôt bonnes mais il y a une chose qui me dérange. Il est possible d'installer phpMyAdmin afin d'administrer des bases de données MySQL mais l'accès à cet outil ne peut se faire que depuis la machine locale. Cela pose donc problème si on utilise Zend Server sur autre chose qu'un poste de développement.

Heureusement, il est très facile de désactiver cet excès de zèle. Pour cela, il suffit d'éditer le fichier /usr/local/zend/gui/lighttpd/etc/lighttpd.conf et de commenter les lignes suivantes :

$HTTP"remoteip" !~ "127.0.0.1" {
    $HTTP"url" =~ "^/phpmyadmin/" {
        url.access-deny = ( "" )
        server.errorfile-prefix = "//usr/local/zend/gui/lighttpd/share/lighttpd-custom-errors/errorcode-"
    }
}

Il faut ensuite redémarrer Lighttpd afin que la modification soit prise en compte :

# zendctl.sh stop-lighttpd
# zendctl.sh start-lighttpd

Et voilà, le tour est joué.

dimanche 13 septembre 2009 à 17h36 - PHP 0   0

De la misanthropie et de l'expérience

On est moins déçu des autres à mesure qu'on se déçoit soit-même.

mercredi 26 août 2009 à 13h46 - Pensées 0   0

Les français et le travail

Une étude effectuée par UBS étude révèle plusieurs choses intéressante sur les français et le travail.

Sans surprise, le pays des 35h est le celui où l'on passe le moins de temps à travailler : environ 1 600 h par an contre 1 900 h en moyenne dans le monde. Sans surprise également, l'Asie est le continent où l'on travaille le plus.

Pa railleurs, la France n'est pas le pays avec le PIB par habitant le plus important, loin de là même car elle est placée au 18e rang mondial.

Cependant, si l'on rapporte le PIB par habitant au nombre d'heures travaillées, la France est le pays qui produit le plus de valeur ajoutée pour une heure de travail d'un de ses habitants. Nous sommes donc le pays le plus productif au monde.

Bien que ce ne soit pas la première fois que la France arrive en tête de ce classement, cela m'interpèle toujours. Tout d'abord, que ce soit au niveau du recrutement ou en tant que client, je constate continuellement que des tas de gens ne font pas leur travail et se contente d'occuper une chaise. Cela veux dire que notre productivité pourrait être bien plus importante qu'elle ne l'est.

Par ailleurs, compte-tenu de ce "manque à gagner" français, la situation des autres pays me laisse perplexe. La déperdition d'énergie est-elle encore plus forte dans ces pays ? Comment est-ce possible ? Je pense notamment à des pays où la fainéantise est socialement très mal vue comme le Japon.

Source : French: The Most Productive People In The World (Non, moi non plus je ne sais pas pourquoi une photo de la première dame de France en maillot de bain illustre cet article)

vendredi 21 août 2009 à 07h40 - Divers 6   0

Parsing de l'analyse syntaxique de fichiers PHP

Afin d'améliorer les méthodes de développement dans la société pour laquelle je travaille, j'ai mis en place un hook Subversion de type "pre-commit" pour vérifier que la syntaxe PHP des fichiers que l'on souhaite commiter est correcte. Je ne parle pas là de respect de standards de codage, juste du respect de la syntaxe PHP. Cela peut paraître inutile mais je retrouve régulièrement des fichiers avec des erreurs de syntaxes.

L'idée est simplement de récupérer la liste des fichiers impactés par le commit en cours et pour chacun d'en vérifier la syntaxe à l'aide de PHP en ligne de commande. J'ai cependant été confronté à une subtilité dont je voudrais vous faire part.

Voici le code complet du hook en question :

#!/usr/bin/php
<?php
$repositoryPath = $_SERVER['argv'][1];
$transaction     = $_SERVER['argv'][2];
$stderr            = fopen('php://stderr', 'w');

(..)
// autres vérifications
(...)

// Checks PHP files for syntax errors
$command = "/usr/bin/svnlook changed -t $transaction $repositoryPath";
exec($command, $lines);

$errorsFound  = false;
$syntaxErrors = '';
foreach ($lines as $line) {
        $file = trim(substr($line, 4));
        if ('.php' == substr($line, -4)) {
                // KLUDGE: PHP returns found syntax errors through stderr so "2>&1" must be added to redirect stderr to stdout
                $command = "/usr/bin/svnlook cat -t '$transaction' '$repositoryPath' '$file' | /usr/bin/php -l 2>&1";
                exec($command, $output, $returnValue);
                if (0 != $returnValue) {
                        $errorsFound   = true;
                        $syntaxErrors .= 'Fichier: ' . $file . PHP_EOL;

                        array_pop($output);
                        foreach ($output as $line) {
                                $position      = strpos($line, ':');
                                $line          = substr($line, $position + 1);
                                $syntaxErrors .= ' - ' . trim($line) . PHP_EOL;
                        }
                        $syntaxErrors .= PHP_EOL .  str_repeat('-', 80) . PHP_EOL;
        }
}
if ($errorsFound) {
        fputs($stderr, str_repeat('-', 80) . PHP_EOL);
        fputs($stderr, 'Des erreurs de syntaxe PHP on ete detectes :' . PHP_EOL . PHP_EOL);
        fputs($stderr, $syntaxErrors);
        fclose($stderr);
        exit(1);
}

fclose($stderr);
exit(0);

La ligne qui nous intéresse principalement est la suivante :

$command = "/usr/bin/svnlook cat -t '$transaction' '$repositoryPath' '$file' | /usr/bin/php -l 2>&1";

La première partie, à gauche du pipe, demande à Subversion d'afficher le contenu du fichier $file du dépôt situé à $repositoryPath et cela pour la transaction $transaction. On parle ici de transaction et non de révision parce que nous sommes avant le commit. Enfin, la partie après le pipe reçoit le contenu du fichier renvoyé par Subversion et l'analyse syntaxiquement.

Je souhaitais afficher des informations sur les erreurs éventuellement rencontrées afin que le développeur sache exactement pourquoi son commit a été rejeté. Le problème est que PHP m'affichait bien les détails quand je capturais la sortie écran avec de l'output buffering mais je ne les avais pas dans la variable sensée contenir la sortie écran.

La raison est en fait toute bête mais on peut y passer un peu de temps avant de trouver si on n'a pas l'habitude du shell. Nous allons donc faire un petit rappel sur le sujet.

Sur Unix, il existe des flux standards. Ce sont des canaux pour l'entrée et la sortie de données. Ces flux sont au nombre de trois, au travers desquels les programmes peuvent faire entrer ou sortir des informations. Ceux qui nous intéressent en l'occurrence sont "stdout" et "stderr". Le premier correspond à la sortie classique tandis que le second correspond aux messages d'erreur.

Revenons maintenant à PHP. La fonction exec() permet de récupérer la sortie dans une variable. Le problème c'est que c'est le flux "stdout" qui est renvoyé et non l'ensemble de l'affichage. Les messages envoyés à "stderr" n'y figurent donc pas, ce qui explique le problème que je rencontrais.

Heureusement, il est possible de rediriger les messages du flux "stderr" vers "stdout" en ajoutant "2>&1" après la commande. Dès lors, la fonction exec() renvoie bien ce que j'attends et je peux afficher les messages d'erreur au développeur.

mercredi 19 août 2009 à 19h31 - PHP 5   0

XHTML - CSS - DotClear - Technorati

Les billets de ce blog sont sous licence Creative Commons