Category Archives: Informatique

PHP 5.3.7 est disponible

Ilia Alshanetsky a annoncé aujourd’hui la sortie de la dernière release mineur de PHP, numérotée 5.3.7. Cette version mineure est la première à avoir suivi la RFC sur le processus de gestion des releases de PHP. Je parlais dans un article précédent de la volonté de professionnalisation des développeurs de PHP. Cette réussite marque donc la fin d’une gestion quelque peu chaotique, tout du moins trop peu organisée.

Les extensions SQLite et PCRE ont été mises à jour respectivement aux versions 3.7.7.1 et 8.12. PHP 5.3.7 corrige également plus de 90 bugs dont une demi douzaine concernait des problèmes de sécurité.

L’annonce officielle a également marqué la fin du support de PHP 5.2.

PHP 5.4 alpha 2 est disponible

PHP fait partie des principaux langages de programmation utilisé dans le monde, il reste très populaire. Créé en 1994 par Rasmus Lerdorf (aussi appelé Dieu dans le milieu), PHP a énormément évolué, près de 31 version mineures pour 5 versions majeures dont la dernière, la 5.0.0, est sortie est en 2004. L’année 2004 peut sembler lointaine pour la dernière sortie d’une version majeure. En réalité les versions mineures 5.1.0, 5.2.0 et 5.3.0 ont amené de très nombreuses modifications même si elles n’ont pas été baptisées « version majeure ». Pour plus d’informations, vous pouvez consulter l’historique au lien suivant.

Contrairement à ses principaux concurrents (.Net ou Java), ce langage n’est pas géré par une entreprise. Ce sont des développeurs (appelés contributeurs) qui bénévolement créent, maintiennent et font évoluer ce langage. De profonds désaccords au sein de la communauté ont eu raison de la version 6 de PHP qui était annoncée comme le messie. Le projet a été abandonné depuis plus d’un an déjà. Pour autant tout n’a pas été perdu. En effet la plupart des avancées programmées dans cette version 6 ont été récupérées et intégrées dans les versions mineures de PHP 5.3. Cet échec, on peut le nommer ainsi, a montré les limites de l’évolution de PHP.

Pour pallier à tous ces problèmes structurels, la communauté s’est accordé sur des méthodes, des outils. Clarté et transparence sont désormais de mise. Toute évolution doit passer par une RFC. Les contributeurs ont d’ailleurs réussi à se mettre d’accord sur les deux RFC suivantes :

  • Un processus de release. Cette RFC permet de donner des jalons à la création des nouvelles versions, ce qui n’existait pas auparavant. Celle-ci met aussi un terme à la sacrosainte compatibilité qui existait jusque là. La compatibilité va enfin pouvoir être cassée quand cela s’avèrera nécessaire.
  • Un processus de vote. Le but de cette RFC est de définir une méthode de vote. Par le passé, il était parfois difficile de connaître les dates de début ou de fin de vote.

Pour ceux que cela intéresse, vous pouvez obtenir plus d’explications au lien suivant. L’article détail les choix à faire concernant des fonctionnalités potentielles.

PHP est souvent considéré comme non professionnel, les stéréotypes sont difficiles à perdre. D’ailleurs la plupart des personnes ayant ces arguments connaissent PHP avec une si ce n’est deux versions de retard. Les contributeurs esssaient au fur et à mesure des nouvelles versions de mettre en place ce qui est reproché à PHP. On ne peut donc qu’apprécier la volonté de supprimer certains « boulets historiques » du langage (ex: les magic quotes).
Le typage des variables revient souvent comme argument. Ainsi la prochaine version devrait transformer les types primitifs (int, bool…) en mots réservés, ce qui permettra d’imposer le type des arguments passés dans des fonctions.

En accord avec le calendrier, la version alpha 2 est disponible au téléchargement depuis hier. Espérons que la prochaine version sortira également à la date convenue… En tout cas, j’ai pour ma part hâte de pouvoir travailler avec cette version.

PHP 5.3.4 est disponible

PHP a annoncé il y a quelques jours la sortie de la version 5.3.4. Cette version est une évolution de maintenance de la série 5.3. Il n’y a donc pas d’évolution majeure, uniquement des correctifs de bugs.

Cela fait un petit moment que cela a été annoncé, mais je le précise pour les lecteurs de ce blog (qui s’y intéressent). La version 6 de PHP telle qu’elle était prévue depuis plusieurs années a été officiellement abandonnée. Les très nombreuses dissensions entre les équipes de développement ont en effet abouti à la mort de PHP 6 dans cette version. Tout n’est pas perdu puisque certaines évolutions ou corrections de PHP 6 sont de toute façon été intégrées dans les releases mineurs de PHP 5.3. Les désaccords sont principalement axés autour de deux points :

  • la volonté de professionnalisation de PHP d’une branche de développeurs
  • la volonté de garder une compatibilité descendante

Les débats sont aujourd’hui repartis sur des bases plus saines.

PHP 5.3.3 est sorti !

La dernière version stable de PHP est disponible depuis hier. Quatre mois après la sortie de PHP 5.3.2, la version 5.3.3 corrigent près d’une centaine de bugs, dont certains posaient des problèmes de sécurité.

Au-delà des corrections de bugs, cette nouvelle release entraîne un incompatibilité concernant la déclaration des constructeurs des classes appartenant à un espace de nom. Les « namespaces » ou espaces de nom n’ayant été introduit dans PHP que dernièrement dans le version 5.3, l’incompatibilité ne pose donc problème que pour les versions 5.3.x.

Depuis l’apparition de la POO dans PHP, les concepts ont bien évolués, l’écriture et l’interprétation du code également. Ainsi en PHP 4, il fallait écrire le code suivant pour utiliser un constructeur.

class Bar {
    function Bar() {}
}

Le constructeur était une méthode dont le nom était à l’identique celui de la classe. La version 5 de PHP a introduit le mot clé __construct pour le constructeur comme le montre le code ci-dessous. Pour des raisons de compatibilités, la façon de faire de la version PHP 4 est toujours reconnue, encore aujourd’hui.

class Bar {
    public function __construct() {}
}

PHP 5.3.3 entame à mon sens un premier virage afin de supprimer cette compatibilité. En effet les classes appartenant à un espace de noms n’auront désormais plus accès à cette possibilité. Cela va donc obliger les développeurs à utiliser les bonnes pratiques comme le montre l’exemple ci-dessous.

namespace Foo;
class Bar {
    public function Bar() {
        // treated as constructor in PHP 5.3.0-5.3.2
        // treated as regular method in PHP 5.3.3
    }
}

La question est donc : à quand l’impossibilité d’utiliser la méthode Bar comme un constructeur ?

Comment stocker des fichiers de cache ?

En informatique, il existe des problèmes récurrents. Le stockage de fichiers de cache en est un. Mais revenons d’abord sur la notion de fichier de cache. Même en optimisant le système, certains traitements peuvent prendre du temps, temps qu’il n’est pas permis de répercuter lors des nombreux autres traitements. Pour illustrer ce propos, prenons l’exemple des droits des utilisateurs. Le calcul des droits d’un utilisateur peut être long, plus ou moins compliqué mais une fois calculé, il est inutile de le recalculer tant que les droits n’ont pas changé. L’utilisation de fichiers de cache permet dans ce cas précis de faire le calcul une fois, d’écrire un fichier avec le résultat du traitement, puis d’aller lire le fichier. Lire un fichier rend ici la récupération des droits de l’utilisateur beaucoup plus rapide.

Après avoir identifié des fichiers de cache à créer il est nécessaire de voir le stockage. Il existe pour cela plusieurs solutions. Dans toute l’explication qui va suivre, on considérera que le stockage de nos fichiers se fait dans le répertoire /var/cache/user-rights/. De plus chaque utilisateur correspond à un numéro qu’on appellera « id ».

Stocker dans un répertoire

La première solution à laquelle pensent souvent les débutants est de stocker tous les fichiers dans le répertoire. On se retrouve ainsi avec l’arborescence suivante :

/var/cache/user-rights/145.cache
/var/cache/user-rights/156.cache
/var/cache/user-rights/28.cache
/var/cache/user-rights/2456.cache
/var/cache/user-rights/58964.cache

Cette méthode est très simple de conception. Elle est très adaptée lorsque le nombre maximum de fichiers de cache est peu élevé. Cette méthode peut s’avérer très dangereuse si le nombre de fichiers croit beaucoup et que l’on a pas d’accès ssh pour faire le ménage. Lister via un client ftp le contenu d’un tel répertoire ayant un grand nombre de fichiers devient tout simplement impossible. On peut ainsi perdre le contrôle sur le répertoire ce qui n’est évidemment pas acceptable.

Créer une arborescence

Tout mettre dans un même répertoire pose également un problème physique d’accès aux données. En effet les systèmes au delà d’un certain nombre de fichiers dans un même répertoire deviennent plus lents. La récupération des droits d’un utilisateur devient ainsi plus lente et l’utilisation de fichiers de cache perd de son efficacité.

La solution à laquelle on pense instantanément est de créer une arborescence de fichiers dans notre répertoire de cache. Pour cela, il suffit de découper l’ »id » utilisateur. On obtient donc l’arborescence suivante:

/var/cache/user-rights/1/4/145.cache
/var/cache/user-rights/1/5/156.cache
/var/cache/user-rights/2/28.cache
/var/cache/user-rights/2/4/5/2456.cache
/var/cache/user-rights/5/8/9/6/58964.cache

Dans un répertoire, on ne peut donc avoir que dix sous répertoires et dix fichiers de caches. Le nombre de sous répertoire pour accéder à un fichier est égale à la formule suivante :

$iNumberOfFolder = floor( log10( $iUserID ) ); // Nombre entier inférieur du logarithme du numéro utilisateur

Cette méthode rend la maintenance bien plus rapide, puisque chaque sous répertoire ne contient que peu d’éléments. La mise en place n’est pas compliquée. Cependant elle pose également quelques problèmes. L’arborescence créée dépend du nombre maximum d’utilisateurs. Quid de l’arborescence quand on atteint un « id » de l’ordre du million ? Cela implique par exemple /var/cache/user-rights/1/5/4/5/2/0/1545200.cache. On voit ici qu’on arrive en fait à l’extrême inverse de la solution précédente. Ici nous avons peu de fichiers et répertoires par sous répertoires mais avons potentiellement une très grosse arborescence.

Minimiser le nombre de sous répertoire

Si on considère qu’on doive créer l’arborescence complète, on s’aperçoit après un petit calcul rapide que le nombre de fichiers et de répertoires suivent les formules suivantes :

$iTotalNumberOfFolder = floor( max( $iUserID ) / 10 ); // Nombre entier inférieur du logarithme du numéro utilisateur
$iTotalNumberOfFile = max( $iUserID );

Dans le cas où l’ »id » utilisateur atteint le million, cela signifie qu’il faut créer quelques cent mille répertoires. C’est énorme. Cela surcharge clairement les serveurs et rend la maintenance très compliquée. Il faut donc trouver un moyen de diminuer le nombre de sous répertoires. Pour cela, il faut modifier le découpage. Au lieu de générer l’arborescence en utilisant un seul chiffre, il est plus intéressant d’en utiliser deux voire trois. En utiliser deux permet de diviser le nombre de répertoire par dix par rapport à la précédente méthode tandis que découper en trois permet de diviser par cent. Le choix dépend après de chaque utilisation. On obtiendrait donc /var/cache/user-rights/15/45/20/1545200.cache ou /var/cache/user-rights/154/520/1545200.cache

Pour les exemples à suivre ci-dessous, nous prendrons un découpage à deux chiffres.

Optimiser la répartition de l’arborescence

Si l’on prend 12012 utilisateurs, on aura à la racine de notre répertoire de cache 90 répertoires allant de 10 à 99. Le nombre de sous fichiers dans chaque de ces sous répertoire n’est pas identique. Calculons le nombre de fichiers pour les sous répertoires 10, 12 et 20.


Sous répertoire 10 : fichiers 100 à 109 + 1000 à 1099 + 10000 à 10999 => 10 + 100 + 1000 = 1110 fichiers

Sous répertoire 12 : fichiers 120 à 129 + 1200 à 1299 + 12000 à 12012 => 10 + 100 + 13 = 123 fichiers

Sous répertoire 20 : fichiers 200 à 209 + 2000 à 2099 => 10 + 100 = 110 fichiers

La répartition dépend ici des deux premiers chiffres du nombre maximum. L’idée pour améliorer la répartition est de découper le nombre en utilisant son nombre inversé. Ainsi pour générer l’arborescence pour le nombre 12456, on utilisera le nombre 65421, ce qui donnera /var/cache/user-rights/65/42/12456.cache. Avec cette méthode, le nombre de répertoire à la racine sera de 100, allant de 00 à 99. Le nombre de fichiers dans chaque sous répertoire correspond à la quantité de nombre se terminant par la valeur de ce sous répertoire. Calculons le nombre de fichiers pour les sous répertoires 10, 12 et 20 de nouveau.


Sous répertoire 10 : fichiers 101 ... 901 + 1001 ... 9901 + 10001 ... 11901 + 12001 => 10 + 100 + 120 + 1 = 231 fichiers

Sous répertoire 12 : fichiers 121 ... 921 + 1021 ... 9921 + 10021 ... 11921 => 10 + 100 + 120 = 230 fichiers

Sous répertoire 20 : fichiers 102 ... 902 + 1002 ... 9902 + 10002 ... 11902 + 12002 => 10 + 100 + 120 = 231 fichiers

Sous répertoire 99 : fichiers 199 ... 999 + 1099 ... 9999 + 10099 ... 11999 => 10 + 100 + 120 = 230 fichiers

On voit avec cette méthode que les fichiers sont plus équitablement répartis.

Google lance Go

On discutait le weekend dernier avec Liz de l’apparition des langages de programmation. Et bien c’est aujourd’hui Google qui lance le sien. Le dernier s’appelle « Go » pour le moment. Je précise pour le moment car ce nom est déjà utilisé pour un langage de programmation. Il semble que « Go » soit un mix des langages de programmation Python et C++. Connaissant la puissance de Google, il faudra donc suivre l’évolution de ce langage qui ne peut être utilisé à grande échelle pour le moment

Source Le Monde

Exclure les fichiers svn dans WinMerge

Lorsqu’on utilise WinMerge pour comparer un répertoire à un projet lié à SVN, un problème se pose très rapidement. Tous les fichiers svn apparaissent dans les rapports et ainsi polluent la comparaison. Il existe un moyen très simple de corriger ce problème : le filtre.

Exclure les fichiers svn sous WinMerge

Exclure les fichiers svn sous WinMerge

Il est possible de créer des filtres afin de modifier le comportement de WinMerge lors de la comparaison. Pour cela il faut créer un fichier winmerge-svn.flt (seul l’extension est importante). Le contenu de ce fichier est :

## This is a directory/file filter for WinMerge
## This filter suppresses various binaries found in SVN source trees
name: SVN loose

## This is an inclusive (loose) filter
## (it lets through everything not specified)
def: include

## Filters for filenames begin with f:
## Filters for directories begin with d:
## (Inline comments begin with " ##" and extend to the end of the line)

f: \..svn$ ## SVN control file

d: \\cvs$ ## CVS control directory
d: \\.svn$ ## SVN control directory

Il suffit ensuite d’installer le filtre et les fichiers svn n’apparaitront plus.

Internet a 40 ans

Il y a quarante ans s’échangeait un message entre deux ordinateurs distants. Situés à l’université de Los Angeles pour l’un et Stanford pour l’autre, ces deux pc utilisaient à l’époque le réseau Arpanet, l’ancêtre d’Internet. A l’origine destiné à une utilisation militaire, il en a dépassé les applications prévues à l’origine.

Source Le Monde

La Maison Blanche en open source

Depuis ce week end, le monde de l’open source a une fois de plus pris une part de marché aux logiciels payants. On assiste depuis quelques années à une montée en puissance des logiciels open source pour plusieurs raisons :

  • L’open source s’est professionnalisé. La notion de « gratuité » est de moins en moins associé aux problèmes de sécurité.
  • L’écart dans de nombreux domaines entre l’open source et le payant s’est réduit.

De très nombreuses administrations migrent vers l’open source, de Microsoft Office vers Open Office par exemple. Ce week end, c’est le site de la Maison Blanche qui est entrée dans le monde du libre en migrant son site web vers Drupal.

Source Le Monde

eZ Publish 4.2

La dernière version du CMS eZ Publish vient tout juste de sortir. Un peu plus de 250 bugs ont été corrigés par rapport à la version 4.1 dans le kernel mais aussi dans les extensions basiques fournies par défaut. De nouvelles extensions sont désormais inclues dans le package de base, ce qui n’était pas le cas de la précédente version. Certaines fonctionnalités ont été ajoutées.

Compatibilité PHP 5.3

Vraie bonne nouvelle, eZ Publish est désormais compatible avec la dernière version de PHP, la 5.3. Celle-ci permet un réel gain de performance comme le montre l’article au lien suivant « eZ Publish performance with PHP 5.3.0″. Cet article a été fait lors de la sortie de la release 4.1.3 d’eZ Publish, la version 4.2 devrait donc être encore plus rapide.

Traduction française

J’annonçais il y a peu la mise en ligne dans les contributions l’arrivée de la traduction française pour la release 4.1.3. Celle-ci n’était cependant pas incluse dans le package de base. Ceci est désormais chose faite pour la version 4.2.