Toute l'actualité francophone sur PHP en un seul flux

1er août – PHP News: Un script bash pour dumper vos bases MySQL table par table

Il existe différentes méthodes et outils permettant de backuper ses bases de données MySQL. Cela va d’une sauvegarde “offline” par copie des fichiers du dossier data de mysql à une sauvegarde “online” avec mysqlhotcopy ou mysqldump , en passant par l’utilisation d’un serveur esclave MySQL réplicant votre serveur maître.

Ne possédant qu’un seul serveur, il est difficile de faire de la réplication. C’est ainsi que j’utilise les outils mysqlhotcopy et mysqldump pour réaliser les sauvegardes de mon serveur SQL.

Pour une sauvegarde du jour J, j’utilise toujours deux backups :

  • Une des fichiers binaires des bases de données (dossier /data de mysql backupé avec mysqlhotcopy)
  • Un dump SQL de toutes les bases (réalisé par mysqldump)

mysqldump permet de sauvegarder des dumps SQL soit d’une base entière, soit de tables précises dans cette base, soit d’enregistrements précis (option –where), soit carrément sauvegarder toutes les bases (option –all-databases). C’est d’ailleurs cette dernière option que j’utilisais jusqu’à présent, avant d’être confronté au problème suivant :

Je dispose d’un fichier de dump complet de mes bases de données, or ce fichier fait plusieurs centaines de mégaoctets. Je peux aisément restaurer tout le serveur. Mais si j’ai besoin de restaurer une table particulière, comment procéder ?

Etant donné la taille du fichier, toute édition classique afin de copier coller la partie intéressante n’est pas possible. Peut-être que la solution se trouve dans une utilisation astucieuse de cat, grep, awk etc … mais je n’ai pas cherché de ce coté là. Je n’ai pas trouvé non plus du coté de la suite MySQL Workbench qui, bien qu’elle fournisse des outils très intéressants dans la modélisation SQL, celle-ci n’offre pas d’analyseur au niveaux des données.

Exemple : Il est possible d’importer un gros dump SQL dans MySQL Workbench qui permet de reconsituter par rétro-ingénierie la modélisation structurelle des bases de données et des tables contenues dans le script. On peut ensuite exporter les différents objets reconstitués (base ou table par exemple), mais l’export ne concerne que la structure de l’objet, et non ses données (on exporte ainsi le script permettant de créer la table ou la base, mais pas les enregistrements originaux de celles-ci)

En bref, un export total des bases avec mysqldump est difficilement utilisable quand il s’agit de restaurer facilement une base ou une table contenu dans ce dump non éditable.

Voici la solution que j’ai donc implémentée :

  • Un script bash va analyser votre serveur SQL et déterminer vos bases de données, ainsi que les tables qu’elles contiennent. Pour chacune des tables, celui-ci va faire appel à mysqldump pour réaliser un dump de cette table qu’il va alors placer dans le dossier correspondant à la base d’appartenance. Une fois toutes les tables backupées, tout est zippé.

Cette solution a plusieurs avantages :

  • Elle permet d’obtenir un dump sql pour chacune de vos tables, aisément manipulable
  • Elle permet toujours de restaurer tout votre serveur sql : Il suffit simplement de concaténer les différents fichiers pour obtenir le dump général.
  • La taille finale de l’archive est équivalent à celle du dump total.

Voiçi le script commenté :

#!/bin/bash
#Dump table par table MySQL - phpnews.fr

#Déclaration de l'utilisateur MySQL aux droits suffisants pour parcourir vos bases de données
#Droit requis : SELECT global, LOCK TABLES
user='backuper'
pass='p@ssw0rd'

#On définit un nom temporaire utilisé par le script (ici la date jusqu'à la minute)
dirname="dump_`date +%d`.`date +%m`.`date +%y`@`date +%H`h`date +%M`"

#On crée sur le disque un répertoire temporaire (changer le chemin précédant /$dirname)
mkdir "/$dirname"

#On place dans un tableau le nom de toutes les bases de données du serveur
#On peut choisir ici d'exclure certaines bases de données de la sauvegarde grâce à la clause LIKE
#Ex : -e "show databases LIKE 'blog_%'"
databases=( $(mysql -u $user -p"$pass" -e "show databases" | grep -v Database) )

#Pour chacune des bases de données trouvées ...
for database in ${databases[@]}
do
#... on crée dans le dossier temporaire un dossier portant le nom de la base
mkdir "/${dirname}/${database}"
#... on récupère chacune des tables de cette base de données dans un tableau ...
tables=( $(mysql $database -u $user -p$pass -e 'show tables' | grep -v Tables_in) )
#... et on parcourt chacune de ces tables ...
for table in ${tables[@]}
do
#... que l'on dump avec mysqldump dans un fichier portant le nom de la table dans le dossier de la bdd parcourue
$(mysqldump -u $user -p$pass --quick --add-locks --lock-tables --extended-insert $database $table > /${dirname}/${database}/${table}.sql)
done
done

#On bzip le tout
tar -cjf /home/server/backup/sql/dump_tables/tables_${dirname}.tar.bz2 /$dirname/

#On supprime le répertoire temporaire
rm -rf /$dirname/

Et voilà le travail ;)

Note : Ce script pose un problème de respect de la consistance de la base de donnée car les différentes tables ne sont pas sauvegardées au même moment. Je vous invite à lire les commentaires de ce billet et d’utiliser ce script avec discernement.

1er août – Nexen.net: Backuper vos bases MySQL

Image pour le titre du contenu
Réaliser un backup de votre base de donnée peut être réalisée de différentes façons.
Mais si on possède qu'un seul serveur, la réplication peut se trouver plus fastidieuse. Et pourtant des outils existent c'est ce que montre le site PHPnews.fr

1er août – PHP Index: Sun microsystems lance son pack AMP

Sun microsystems vient d'annoncer la disponibilité de son pack AMP pour systèmes d'exploitation Solaris et Linux.

Ce pack est constitué du serveur HTTP Apache, du système de gestion de base de données MySQL et du langage PHP (et PERL). Le pack est disponible en téléchargement sur le site de Sun.

1er août – Apprendre-PHP.com: Les exceptions - 2ème partie

La première partie de ce tutoriel a été l'occasion de présenter le mécanisme des exceptions de manière très théorique. Au travers d'exemples simples et concrets, nous avons découvert comment générer, lancer et attraper des exceptions en plein vol. A ce stade, nous sommes encore loin de pouvoir profiter pleinement des exceptions dans des applications plus conséquente. C'est pourquoi cette seconde et dernière partie s'intéressera à la manière de dériver la classe Exception pour créer des exceptions personnalisées. Enfin, nous étudierons un mécanisme natif de PHP qui permet de centraliser et d'unifier le traitement des exceptions non capturées dans une fonction de callback appelée automatiquement par l'exception handler.

2 août – Nexen.net: Apache Sponsorisé par Microsoft

Image pour le titre du contenu
Voici quelques jours, au dernier grand Rendez-vous de OSCON 2008 (O'Reilly Open Source Convention), l'annonce fut effectué.. Après Google, Yahoo, voici maintenant Microsoft qui joint les rangs comme donateur pour le projet Apache.
Pour rappel, et si vous regardez les statistiques que le site Nexen propose tous les mois, apache représente plus de 70 % d'adoptions.
Par ailleurs, Microsoft depuis quelques temps, investi beaucoup dans les projets open source comme PHP ou sous forme d'accord avec Zend
Pour avoir des informations supplémentaires qui sont actuellement beaucoup relayé, voici un des articles que j'ai retenu ci-dessous

2 août – Apprendre-PHP.com: Installer un environnement LAMP6 sur Debian

PHP 6 pointe enfin le bout de son nez ! Eh oui, certains passionnés attendent sa sortie avec impatience. Je teste PHP 6 depuis un an environ et bien-sûr uniquement en test vu que la version stable n'est pas encore sortie à l'heure où j'écris ces lignes. Ce tutoriel est basé sur un article que j'ai écrit pour le magazine Linux+DVD. Il s'agit de déployer pas à pas un environnement LAMP 6 (Apache 2, PHP 6 et MySQL 6) sur une distribution Linux Debian.

2 août – Nexen.net: Actualité de développement PEAR, edition 213

Image pour le titre du contenu
7 paquets ont été mis à jour cette semaine :

PEAR est la bibliothèque de composants PHP.

 



 

3 août – Nexen.net: Alertes sécurité des applications PHP et MySQL, édition 213

Image pour le titre du contenu


PHP et MySQL ne font l'objet d'aucune alerte de sécurité dans leurs versions courantes :
PHP 5.2.6 et 4.4.8; MySQL 5.0.51 (communauté) , 5.1.24-rc et 6.0.4.
Les mises à jour sont recommandées vers ces versions.



2 alertes de sécurité ont été émises cette semaine, concernant des applications suivantes :
Claroline et phpMyAdmin




./

4 août – Nexen.net: DotClear 2.0 finale

Image pour le titre du contenu
La nouvelle version de Dotclear vient de sortir en version finale avec de nombreuses évolutions et corrections
Les principales caractéristiques de cette application sont :
  • Multiblog
  • Multi-tilisateur avec permissions
  • Installation automatisée
  • Import/Export
  • AntiSpam
  • tags
  • Catégories
  • etc...

4 août – Nexen.net: Drizzle : MySQL au régime

Image pour le titre du contenu
Monty Widenius et Brian Aker lancent actuellement un projet baptisé 'Drizzle' (bruine, en anglais) : c'est un fork (le troisième?) de MySQL, qui a pour but de réduire les fonctionnalités proposées par la base à un jeu d'instructions réduit, et d'impliquer la communauté dans le processus de développement.
Le projet, disponible d'ici 3 ou 4 mois, entend se passer des fonctionnalités encombrantes (comme les index full text ou géographiques), se concentrer sur les bugs critiques et pratiquer une refactorisation du code. Les fonctionnalités seront extraites du coeur et reviendront comme des interfaces modulaires. Avec un coeur allégé, plus moderne et plus rapide, il deviendra plus facile de comparer l'évolution du serveur MySQL sur différentes plate-formes, et appliquer des corrections.
Le plus importants, dans ce projet, est le retour de la communauté dans le coeur du développement : nombre de contributions ont été oubliées dans les années précédentes, et Drizzle demandera les contributions de chacun. La direction de Sun voit d'un bon oeil le lancement de ce projet, qui a été rendue possible par l'acquisition de MySQL par Sun. Il semble que les techniciens reprennent l'initiative et la possession du code, face aux objectifs commerciaux.
Un développement à suivre, dans les projets mois.

4 août – Nexen.net: PHP 4.4.9RC1 et PHP 5.3.0alpha1

Image pour le titre du contenu
Johannes Schlützer publie la version alpha1 de PHP 5.3.0. C'est la première version en vue de la finalisation de PHP 5.3.0, et si vous êtes déjà en train de compiler PHP 4.4.9, il est temps de faire la même chose pour PHP 5.3.0 : attendez-vous tout de même à plus longtemps de compilation, et un PHP très vitaminé :

  • Espaces de noms (Namespaces)

  • Late static binding et __callStatic

  • Fonctions lambda et fermetures (closures)

  • Ajout des extensions intl, phar, fileinfo et sqlite3

  • Garbage collection cyclique et optionnelle

  • Support de MySQLnd en remplacement de libmysql

  • Nouvelles syntaxes telle que NOWDOC, GOTO limités, opérateur ternaire "?:"


Compilez PHP 5.3.0, puis exécutez les milliers de tests, issus du test fest de juin 2008 pour vérifier que PHP fonctionne bien comme attendu sur votre plate-forme. L'équipe de développement de PHP pourra alors corriger au mieux les problèmes rencontrés.

4 août – Nexen.net: Je suis 13% féminin

Image pour le titre du contenu
et 87 % masculin. C'est le résultat d'un test que je viens de passer sur le site de mikeonads : à partir d'un petit javascript, il évalue la liste des sites que j'ai visité récemment. Puis, il prend le ratio homme/femme de chacun de ces sites, et en déduit un pourcentage. C'est simple et amusant.
D'un point de vue sécurité, c'est tout de même apeurant de voir comment il est facile de détecter les visites de certains sites. Si vous avez vu apparaître des spams qui vous ciblent bien (par exemple, c'est bien votre vraie banque qui est souvent utilisée pour un hammeçonnage, et pas juste Bank of America), alors vous avez surement un début de réponse ici.

4 août – Nexen.net: Sysbench : pour mesurer la charge sur un serveur MySQL

Image pour le titre du contenu
Patrick Lafontaine présente Sysbench, un outil pratique pour évaluer l'impact d'une charge MySQL sur un serveur. En fait, l'outil mesure différentes variables importantes durant l'exécution d'une commande : processeur, mémoires, transferts, disques dur, etc. En fait, on peut l'utiliser pour MySQL mais pour bien d'autres choses, comme le serveur Web, ou un script PHP de tâche de fond.

5 août – Hello Design: kit de sécurité

Il se trouve en vigueur depuis le 1er juillet 2008, Le kit de sécurité se compose d'un triangle et d'un gilet jaune ou orange comme ceci :
Sinon vous pouvez avoir une contravention de 135 euro si vous ne l'avez pas et 90 euros s'il vous en manque l'un ou l'autre.
 
Maintenant, suite à une enquete d'un magazine automobile, de nombreux triangle sont trop léger et vont s'envoler aux passages de voitures ou camions.
  
Pour avoir un kit de sécurité, je conseille ce site. surtout que le triangle fait environ 1 Kg 300....
Il est même possible d'en avoir plusieurs sur devis... http://actualite.naoss.fr ou sur cette page : cliquer ici
 
 

5 août – Nexen.net: Suhosin 0.9.25

Image pour le titre du contenu
Suhosin 0.9.25 est publié aujourd'hui, avec la compatibilité pour PHP 5.3 et 4 et un changement de valeur par défaut.
Au passage, Stefan Esser change son blogue pour suspekt.org, afin de pouvoir parler d'autres sujets que de sécurité PHP.

6 août – tigrou/pwet.fr: En attendant eZ Publish 4.0.1 (ou 4.1)

Edit : il suffit que j'écrive un billet sur le sujet pour que la RC2 sorte avec enfin la correction des problèmes d'URL Alias. La version finale est aussi annoncée d'ici une à deux semaines sur la mailing liste si tout va bien.

eZ Publish 4.0 est sorti en décembre 2007 et depuis rien, aucune version stable. 8 mois c'est vraiment très très très long, il y a donc forcément des bugs gênants dans eZ Publish 4.0 d'autant plus que cette version est un portage vers PHP5 de la version 3.10 ce qui occasionne encore quelques bugs supplémentaires. La roadmap du bugtracker liste les problèmes résolus et non résolus mais il n'est pas toujours simple de faire le lien entre un comportement suspect et un bug dans cette liste.

Par exemple en développant la nouvelle version de ce site, je me suis trouvé face à plusieurs problèmes qui ont nécessité l'inclusion de patchs issus du SVN .

Les cache-block qui n'expirent pas

Il s'agit du bug #12175 qui empêche l'utilisation des cache-block expirant avec une sous-arborescence . Pour règler ce problème sans passer à la version 4.0.1rc1 il faut appliquer 3 patchs successifs sur l'arborescence d'eZ Publish 4.

$ cd /tmp
$ wget http://pwet.fr/content/download/71716/214901/file/patch_cache_block_12175.tar.gz
$ tar -zxvf patch_cache_block_12175.tar.gz
$ cd /path/to/ez/publish/
$ patch -p0 < /tmp/01_cache-block.patch
$ patch -p0 < /tmp/02_cache-block.patch
$ patch -p0 < /tmp/03_cache-block.patch

Les erreurs sur l'application du patch sur le change log peuvent être tranquillement ignorées.

Les variations des images re-dimensionnées en permanence

Celui la, c'est un bug vicieux , on s'en rend compte lors de la mise en production quand la machine est à plat par tous les convert (ou apache si on utilise GD) en train de générer les différentes variations encore et encore. 80 de load average sur ma pauvre Dedibox, elle a du avoir chaud ;-)

un seul patch est nécessaire et c'est immédiat et magique sur la charge de la machine

$ cd /tmp
$ wget http://pwet.fr/content/download/71717/214904/file/image_variations.patch
$ cd /path/to/ez/publish
$ patch -p0 < /tmp/image_variations.patch

J'ai pas eu d'autres bugs bloquants (enfin je les ai pas encore remarqué :)), j'en ai d'ailleurs découvert un sur le SmartCacheClear avec les keywords , la correction est dans le rapport et tient sur une unique ligne.

6 août – Nexen.net: Concours de bataille de services Web en ligne

Image pour le titre du contenu
Paul Reinheimer lance un concours de bot : dans une arène, des robots écrits en PHP se déplacent, cherchent leurs adversaires et tentent de les détruire. Un système de services Web permet d'interroger successivement les bots, et une fois la partie lancée, ce dernier est totalement autonome pour rester le dernier survivant.
Que ce soit pour écrire un service Web, un robot ou simplement jouer en ligne, voici un concours qui devrait occuper du code.

6 août – Nexen.net: Utiliser GNUPG avec PHP

Image pour le titre du contenu
Pour chiffrer des données, il y a la bibliothèque mcrypt, intégrée dans PHP, et il y a aussi GnuPG, un outil pour signer et chiffrer des messages. Lui aussi est maintenant intégré à PHP, et fonctionne sous forme d'extension. C'est une option facile pour intégrer de la cryptographie dans vos scripts.

6 août – Nexen.net: InfoWorld remet les prix des meilleures application Open Source 2008

Image pour le titre du contenu
Inforworld remet les prix des meilleures applications Open Source pour 2008. Les applications sont réparties en huit catégories : applications d'entreprise, plate-forme, collaboration, développement, productivité, réseau, sécurité, stockage.
MySQL gagne le prix de la meilleure base de données, tandis que PHP est représenté par une impressionnante liste d'applications : SugarCRM, WordPress, phpMyAdmin, MediaWiki, dotProject et Magento.
Il y a aussi la catégorie sécurité qui propose plusieurs outils très intéressants pour les tests et la détection d'intrusion... à tester!

6 août – Nexen.net: Vidéo PHP et MySQL, édition 55

Image pour le titre du contenu
Voici les 5 dernières vidéos PHP et MySQL.


Ces vidéos sont publiés sur les sites de partagent de vidéo. Ce sont des tutoriels enregistrés, des sessions de conférences, des screencast ou encore des slides de conférences.



N'hésitez pas à nous contacter pour signaler tout media qui mérite d'être ajouté à cette liste.

7 août – Kamelot Blog: PEAR::Pager tuto : Créer des cool Url pour la pagination avec Pager et mod_rewrite

Ce texte est une des traductions d'une série d'articles de Lorenzo Alberton (original)

La plupart des classes de pagination PHP peuvent fonctionner très bien avec des paramètres GET, correctement envoyés par les pages.

Cependant, rares sont celles qui vous laissent le contrôle sur les liens qu'elles créent.

Ceci peut être particulièrement ennuyant quand vous travaillez avec des cool URL (grâce à mod_rewrite ordonne ou fait à la main par votre contrôleur) et la classe de de pagination ne peut pas les respecter, en affichant les liens réels et laids.

Si le scénario ci-dessus n'est pas nouveau pour vous, alors vous devriez probablement tester PEAR::Pager.

C'est un paquet entièrement personnalisable qui devrait satisfaire tous vos besoins, y compris votre format préféré de lien.

Exemple : Comment dire au pager le format de vos liens

Supposons-vous ont un site de commerce électronique, avec un catalogue de produit que l'utilisateur peut passer en revue par catégorie.

Par exemple, pour énumérer tous les produits de la catégorie AAA, vous passez ce paramètre à votre page : http://monserveur.com/produits.php?cat=AAA.

Si le catalogue est assez grand, la dispersion des produits dans plusieurs pages serait une décision intéressante, mais maintenant vous devez également passer le numéro de page à l'URL : http://monserveur.com/produits.php?cat=AAA&pageID=3.

Naturellement votre application intelligente peut produire des URL plus propres, comme ceci : /produits/AAA/3.html qui sont facilement décodés par le mod_rewrite.

Voyons l'exemple de règle .htaccess pour cette transformation d'URL :

[apache]
RewriteEngine on

RewriteBase /
RewriteRule ^produits/(\w+)/(\d+)\.html$ /produits.php?cat=$1&pageID=$2 [L]

Normalement, la classe de pagination les paramètres de cat et de pageID et établirait les liens comme d'habitude, c.-à-d.

/produits.php?cat=AAA&pageID=1
/produits.php?cat=AAA&pageID=2
...
/produits.php?cat=AAA&pageID=6

mais vous pouvez apprendre à PEAR::Pager à produire les liens qui respectent votre convention :

[php]
<?php
require_once 'Pager/Pager.php';

//toujours valider paramètres GET

if (!empty($_GET['cat']) && $myApp->is_valid_cat($_GET['cat'])) {
    $cat = $_GET['cat'];
} else {
    $cat = 'AAA'; //default category
}

// Récupération des produits. 
// S'il y a beaucoup de produits, 
// vous pouvez envisager d'employer les fonctions de Pager_Wrapper 

$produitList = $myApp->getProductsByCat($cat);

$pager_params = array(
    'mode'     => 'Sliding',
    'append'   => false,  //ne pas ajouter les paramètres GET à l'URL
    'path'     => 'http://monserveur.com/produits/' . $cat,
    'fileName' => '%d.html',  //Pager remplace "%d" par le numéro de la page
    'perPage'  => 10, //afficher 10 articles par page
    'itemData' => $produitList,
);
$pager = & Pager::factory($pager_params);
$data  = $pager->getPageData();

//Afficher les produits de la page courante
echo 'Données de la page courante: ';
print_r($data);

//afficher les liens pour la navigation dans la catégorie courante 
echo $pager->links;
?>

Comme vous pouvez voir, vous pouvez dire au pager le chemin et le nom de fichier qu'il devrait employer.

N'oubliez pas de placer l'option de append à FALSE, sinon le pager essayera d'apposer les vars GET à l'URL comme d'habitude.

Example #2: le numéro de la page est dans le chemin et non dans le nom du fichier?

Et si le numéro de la page dans votre url se trouve dans le path et non dans nom fichier?

Ca pourrait ressembler à un problème, puisque Pager recherche la chaîne « %d » dans le paramètre nom de fichier, et se plaint s'il ne peut pas y trouver cette chaîne.

Non, vous ne pouvez pas le mettre dans le paramètre path, mais puisque le pager combinera simplement les paramètres path et nom de fichier pour former l'URL, nous pouvons le duper et mettre une partie du path dans le nom de fichier lui-même.

Pour le moment, si nous avons une url comme http://monserveur.com/produits/AAA/3/index.html, où "3" est le numéro de la page, cette règle de mod_rewrite et ce script php le feront fonctionner:

[apache]
RewriteEngine on

RewriteBase /
RewriteRule ^produits/(\w+)/(\d+)/index\.html$ /produits.php?cat=$1&pageID=$2 [L]
[php]
<?php
require_once 'Pager/Pager.php';

// ...

$pager_params = array(
    'mode'     => 'Sliding',
    'append'   => false,  //ne pas ajouter les paramètres GET à l'URL
    'path'     => 'http://monserveur.com/produits/' . $cat,
    'fileName' => '%d/index.html',  //Pager remplaces "%d" par le numéro de la page
    'perPage'  => 10, //afficher 10 articles par page
    'itemData' => $produitList,
);
$pager = & Pager::factory($pager_params);
$data  = $pager->getPageData();

//afficher les produits de la page courante
echo 'Données de la page courante: ';
print_r($data);

//afficher les liens pour la navigation dans la catégorie courante 
echo $pager->links;
?>

Voilà c'est fait. J'espère que ce tuto était utile.

à lire aussi

7 août – Nexen.net: Actualité de développement PECL, edition 211

Image pour le titre du contenu
3 paquets ont été mis à jour cette semaine :

  • en sphinx (0 visite) : extension pour sphinx, le moteur de recherche

  • en KTaglib (0 visite) : bibliothèque d'accès aux tags des fichiers musicaux

  • en optimizer (0 visite) : extension d'optimisation pour APC


PECL est la bibliothèque d'extensions C de PHP.

 



 

7 août – Nexen.net: PHP 4 est mort, vive PHP 5!

Image pour le titre du contenu
PHP 4 a vu sa toute dernière version sortir hier : PHP 4.4.9 est la dernière et finale version de la lignée des PHP 4. Cette lignée a été baptisée stable depuis le 22 mai 2000, et a évolué jusqu'en 2005, au gré des efforts pour stabiliser la plate-forme : super-globales, références, CLI.
En 2008, force est de constater qu'il reste encore 60% d'utilisateurs de PHP 4 dans le monde, signe tangible de son succès. PHP 5 a beau déployer des trésors d'innovations, comme la POO, des performances surmultipliées, une sécurité très renforcée, un support XML d'avant-garde, il doit toujours se tenir dans l'ombre de son grand frère.
Désormais, PHP 5 devient le grand frère, et accompagnera PHP 6 dans son entrée sur la scène du Web. PHP 4 est mort, enterré, et l'entêtement à conserver PHP 4 en ligne va bientôt devenir aussi risible que d'être sur PHP 2 ou 3.
PHP 4 est mort, vive PHP 5!

8 août – Apprendre-PHP.com: PHP s'arrête à la version 4.4.9

Nous sommes le 08 août et il est tout juste 1h du matin à l'heure où j'écris ces quelques lignes. Alors que je devrais me coucher et me préparer à une bonne nuit de sommeil, PHP 4 s'apprête tout juste à signer son arrêt définitif après tant de bons et loyaux services auprès des amateurs...

8 août – z-f.fr: ZF 2.0, PHP 5.3 et namespaces

Forum: Brèves
Auteur: philippe
Écrit le: Fri, 08 Aug 2008 10:33:41 +0200
Dernier message: Wed, 01 Oct 2008 09:42:33 +0200

8 août – Nexen.net: MySQL 5.0.67 publié

Image pour le titre du contenu
MySQL 5.0.67, la dernière version du système de basede données Open Source, a été publiée. Cette édition communauté est disponible en format source et binaire, pour de nombreuses plate-forme sur le site de téléchargement.
MySQL 5.0 est la version GA actuelle de MySQL, et cela  faisait un an que la version communauté n'avait pas été publiée officiellement. Il y a donc un effet de rattrapage dans
cette version, avec plusieurs changement de sécurité et de fonctionnalités. 
MySQL 5.1 devrait sortir en version GA prochainement, et ne s'encombre pas du modèle communauté/professionnel de la 5.0.
Drizzle a été lancé sous forme de fork de MySQL. 

  • le plugin_dir qui gère la source des fonctions utilisateurs a été rapporté de MySQL 5.1 pour améliorer la sécurité.

  • Le moteur FEDERATED est désactivé par défaut.

  • NDB_LE_MemoryUsage.page_size_kb a été renommé

  • CHECK TABLE ,,, FOR UPGRADE et REPAIR TABLE ont changé leur gestion des fichiers .frm incompatibles.

  • Les tables MyISAM utilisant les clauses DATA DIRECTORY et INDEX DIRECTORY avait une faille de sécurité.

  • Trois failles dans yaSSL ont été découvertes

  • ALTER VIEW conservait les droits initiaux de son créateur.

  • Les tables fédérées pouvaient crasher le serveur client en renvoyant moins de colonnes de demandé.

  • On pouvait crasher MySQL en lui faisant produire un message d'erreur très grand.

  • le mode ONLY_FULL_GROUP_BY ne rejetait pas les bonnes requêtes SQL

  • Un patch de MySQL 5.0.50 a été annulé, pour cause de nouveaux problèmes

  • Plusieurs fonctions qui conservent le type ne le faisaient pas : LEAST, GREATEST, COALESCE, IFNULL, IF.

  • Il était possible de faire lire deux fois le même fichier de configuration au démarrage

  • AUTO_INCREMENT et NDB avait un bug

  • Replication : lorsque le maître crashait durant une transaction d'UPDATE, cela bloquait le serveur.

  • Les fonctions de dates comme FRAC_SECOND ont changé de nom.

  • Le serveur ne signale plus la suppression des espaces surnuméraires.

  • Le log de réplication pouvait être corrompu par des problèmes de réseau.

8 août – Nexen.net: Alertes sécurité des applications PHP et MySQL, édition 214

Image pour le titre du contenu


PHP et MySQL ne font l'objet d'aucune alerte de sécurité dans leurs versions courantes :
PHP 5.2.6 et 4.4.9; MySQL 5.0.67 (communauté) , 5.1.26 et 6.0.5.
Les mises à jour sont recommandées vers ces versions.



7 alertes de sécurité ont été émises cette semaine, concernant des applications suivantes :
Gallery, Joomla, PHP Nuke, XAMPP, Xoops, e107 et phpMyAdmin



9 août – Kamelot Blog: PEAR::PAGER, Paginations d'article, ou comment naviguer dans les paragraphes d'un article avec le paginateur

Ce texte est une des traductions d'une série d'articles de Lorenzo Alberton

Vous avez probablement vu beaucoup de sites Web comporter des articles longs et détaillés, qui sont coupés en paragraphes, chacun présenté dans une page séparée.

Les utilisateurs préfèrent souvent lire les morceaux courts du texte au lieu de faire défiler une très(trop) longue page (à moins qu'ils ne veulent l'imprimer).

Dans ce tuto, nous allons voir comment nous pouvons établir un système de paginations d'article, a l'aide de PEAR::Pager.

La structure de base de données

Nous aurons besoin de deux tables pour stocker nos articles :

  • une avec l'information de base des article (auteur, titre, résumé, date de publication)
  • et une contenant les paragraphes (un par enregistrement, avec le titre et le contenu).

Techniquement, nous pourrions employer juste une table, utilisant quelques délimiteurs spéciaux incorporés dans le texte (tel que le « ====FIN DE PAGE====") pour découper les paragraphes, mais croyez moi qu'à la longue cette une solution bien meilleure

[SQL]
CREATE TABLE articles (
  id INTEGER NOT NULL,
  title VARCHAR(250) NOT NULL,
  abstract TEXT,
  submission_date TIMESTAMP NOT NULL,
  author_id INTEGER NOT NULL,
  CONSTRAINT articles_pkey PRIMARY KEY(id)
);

CREATE TABLE paragraphs (
  article_id INTEGER NOT NULL,
  paragraph_id INTEGER NOT NULL,
  title VARCHAR(250),
  content TEXT,
  CONSTRAINT paragraphs_pkey PRIMARY KEY(article_id, paragraph_id),
  CONSTRAINT paragraphs_fk FOREIGN KEY (article_id) REFERENCES articles(id) ON DELETE CASCADE
);

Données d'exemple

Voici quelques données d'exemple si vous voulez tester tout en lisant ce tuto :

[SQL]
-- Premier Article
INSERT INTO articles (id, title, abstract, submission_date, author_id) VALUES (
  1,
  'How to navigate through the paragraphs of an article with Pager',
  'You\'ve probably seen a lot of websites featuring long, detailed articles, which are split into paragraphs, each of them in a separate page. Users often prefer reading short chunks of text instead of scrolling a very long page (unless they want to print the page, then the opposite applies). In this tutorial, we\'re going to see how we can build an article pagination system, with a little help from PEAR::Pager.',
  CURRENT_TIMESTAMP,
  1
);
INSERT INTO paragraphs (article_id, paragraph_id, title, content) VALUES (1, 1, 'The database structure', 'First paragraph here');
INSERT INTO paragraphs (article_id, paragraph_id, title, content) VALUES (1, 2, 'Sample data', 'Second paragraph here');
INSERT INTO paragraphs (article_id, paragraph_id, title, content) VALUES (1, 3, 'Showtime', 'Third paragraph here');
INSERT INTO paragraphs (article_id, paragraph_id, title, content) VALUES (1, 4, 'Alternate navigation', 'Fourth paragraph here');
INSERT INTO paragraphs (article_id, paragraph_id, title, content) VALUES (1, 5, 'Article summary', 'Fifth paragraph here');
INSERT INTO paragraphs (article_id, paragraph_id, title, content) VALUES (1, 6, 'Printer friendly version', 'Sixth paragraph here');

-- Second Article
INSERT INTO articles (id, title, abstract, submission_date, author_id) VALUES (
  2,
  'PEAR::Pager tutorials',
  'New series of tutorials about PEAR::Pager',
  CURRENT_TIMESTAMP,
  1
);
INSERT INTO paragraphs (article_id, paragraph_id, title, content) VALUES (2, 1, 'Articles index', '1. How to efficiently paginate database results.  2. Create pretty links with Pager and mod_rewrite.  3. Navigation with Pager and AJAX (or simple Javascript).  4. Article pagination.');

Showtime!

Maintenant que nous sommes ok avec la structure de base de données, nous pouvons afficher les articles sur notre site, un paragraphe par la page.

Pour cette tâche, nous allons employer PEAR::MDB2 DBAL et le bien pratique Pager_Wrapper que nous avons déjà vu dans un tuto précédent :

[php]
<?php
//Copier le fichier Pager_Wrapper file là où il peut-être inclu
require_once 'Pager_Wrapper.php';
require_once 'MDB2.php';

$article_id = 1; //if you fetch this parameter via GET/POST, remember to validate it!

//on passe le code de connexion DB 
//on suppose qu'on a une connexion valide dans  $db

$pager_options = array(
    'mode'       => 'Sliding',
    'perPage'    => 1, //On ne veut qu'un paragraphe par page
    'delta'      => 3,
);

$query = 'SELECT articles.title AS article_title,
                 articles.submission_date,
                 articles.abstract,
                 paragraphs.title AS paragraph_title,
                 paragraphs.content
            FROM paragraphs
       LEFT JOIN articles ON articles.id = paragraphs.article_id
           WHERE articles.id = '. (int)$article_id .'
        ORDER BY paragraphs.paragraph_id;

$paged_data = Pager_Wrapper_MDB2($db, $query, $pager_options);

//Afficher les résultats
echo '<h1>'.$paged_data['data'][0]['article_title'].'</h1>';
echo '<p><i>'.$paged_data['data'][0]['submission_date'].'</i></p>';
if ($paged_data['page_numbers']['current'] == 1) {
    // afficher aussi le résumé.
    echo '<p>'.$paged_data['data'][0]['abstract'].'</p>';
}
echo '<h2>'.$paged_data['data'][0]['paragraph_title'].'</h2>';
echo '<p>'.$paged_data['data'][0]['content'].'</p>';

//afficher les liens
echo $paged_data['links'];
?>

Puisque nous avons demandé au paginateur de couper les articles (les paragraphes, dans notre cas) en groupes de "un", il renverra seulement un paragraphe, et nous pouvons naviguer vers les autres paragraphes avec les liens générés par paginateur.

Voici le rendu du script :

Pager with links example


Autre navigation

Si vous n'aimez pas des liens normaux pour la navigation, et préférez un menu de <select> à la place, vous devez ajouter un appel à la la fonction getPageSelectBox () dans Pager_Wrapper_MDB2, avant de renvoyer le tableau de données paginée, puisqu'elle n'est pas incluse dans la version par défaut :

[php]
function Pager_Wrapper_MDB2(&$db, $query, $pager_options = array(), $disabled = false, $fetchMode = MDB2_FETCHMODE_ASSOC)
{
  // Pager_Wrapper_MDB2() body omitted. Add the following lines before the return call:

  // ===== Début du  CODE ajouté  ======
  $selectbox_options = array(
      'optionText' => 'page %d',
      'autoSubmit' => true,
  );
  $page['select_menu'] = $pager->getPageSelectBox($selectbox_options);
  // ===== Fin du  CODE ajouté =====

  return $page;
}

Maintenant on affiche le menu de navigation :

[php]
<?php
// [snip: même code que dans le paragraphe précédent]

//Affichage du menu
echo 'Choisissez une page: '. $paged_data['select_menu'];
?>

Et voilà ce que ca devrait donner: Pager avec exemple de menu select


Sommaire de l'article

Parfois, vous pouvez vouloir montrer un sommaire de l'article, avec une liste des titres de paragraphe, chacun indiquant le paragraphe complet.

Aucun problème, vous pouvez faire cela.

[php]
<?php
$query = 'SELECT title
            FROM paragraphs
           WHERE article_id = '. (int)$article_id
     .' ORDER BY paragraph_id';
$paragraph_titles = $db->queryCol($query);
//on oublide le code de vérification

echo '<h2>Sommaire</h2>';
echo '<ul>';
foreach ($paragraph_titles as $k => $title) {
    if ($k == ($paged_data['page_numbers']['current'] -1)) {
        // Page courrante, ne pas afficher le lien
        echo '<li>' . $title . '</li>';
    } else {
        echo '<li><a href="article.php?id='. (int)$article_id .'&pageID='. ($k+1) .'">'. $title . '</a></li>';
    }
}
echo '</ul>';
?>

Le résultat est un résumé des titres de paragraphe, avec leurs liens Exemple de sommaire


Version imprimable

Si vous voulez proposer une version pour l'impression avec l'article complet, vous pouvez chercher tous les paragraphes et simplement les afficher l'un après l'autre :

[php]
<?php
$query = 'SELECT title,
                 submission_date,
                 abstract
            FROM articles
           WHERE id = '. (int)$article_id;
$article = $db->queryRow($query, null, MDB2_FETCHMODE_ASSOC);

$query = 'SELECT title,
                 content
            FROM paragraphs
           WHERE article_id = '. (int)$article_id
     .' ORDER BY paragraph_id';
$paragraphs = $db->queryAll($query, null, MDB2_FETCHMODE_ASSOC);

//Afficher les données principales de l'article:
echo '<h1>'.$article['title'].'</h1>';
echo '<p><i>'.$article['submission_date'].'</i></p>';
echo '<p>'.$article['abstract'].'</p>';


// Afficher les paragraphes de l'article:
foreach ($paragraphs as $paragraph) {
    echo '<h2>'.$paragraph['title'].'</h2>';
    echo '<p>'.$paragraph['content'].'</p>';
}

?>

J'espère que ce tuto était utile (la traduc aussi :).

Si vous avez besoin de quelques clarifications, ou avez quelques suggestions , envoyez-nous un mail :

  • Lorenzo de préférence mais en anglais.
  • Moi de préférence mais en anglais.

9 août – Nexen.net: Cachez vos sessions sans ennuyer vos utilisateurs

Image pour le titre du contenu
memcache est de plus en plus utilisé pour stocker des informations rapides et transitoires pour les applications Web. memcache assure un service distribué et rapide de cache, mais n'arrive pas qu'avec des avantages.
Avec les sessions, si vous utilisez memcache, un reboot memcache (pour l'OS, le matériel ou la configuration) signifie que vous expulsez tous vos utilisateurs d'un coup. Il faut alors bien comprendre un pré-requis de memcache : c'est un système de cache, qui ne doit pas affecter le fonctionnement de votre application en cas de crash ou autres défaillance.

9 août – Nexen.net: Créer des cartes KML avec DOM

Image pour le titre du contenu
"Nous avons commencé à travailler avec des services de localisation. Un des tâches fut de créer un service Web pour servir des marqueur géographiques. Nous avons choisi le KML (Keyhole Markup Language) de google. Il est d'ailleurs devenu un standard officiel du Open Geospatial Consortium (OGC)."
Et on peut le produire facilement avec PHP, bien sûr, grâce à l'extension DOM de PHP 5.

9 août – Nexen.net: Actualité de développement PEAR, edition 214

Image pour le titre du contenu
6 paquets ont été mis à jour cette semaine :

  • en Date_Holidays (0 visite) : Calculs de jours feriés

  • en Log (0 visite) : Utilitaire de log

  • en SOAP (0 visite) : Client/Serveur SOAP

  • en PEAR_Frontend_Web (0 visite) : Interface Web pour l'installeur PEAR

  • en pearweb_gopear (0 visite) : Script go-pear pour pear.php.net

  • en PEAR_Size (0 visite) : Détermine l'espace disque d'un paquet


PEAR est la bibliothèque de composants PHP.

 



 

9 août – Nexen.net: Symfony camp, les 12 et 13 septembre 2008, aux Pays-Bas

Image pour le titre du contenu
"Cette année encore, le DOP organise un camp Symfony. L'événement a lieu les 12 et 13 Septembre 2008. C'est une occasion unique pour rencontrer la communauté.
Le camp commencera par une formation sur symfony 1.1, donnée par Nicolas Perriault (symfony 1.1 release manager)"
Durant le camp, vous pourrez notamment rencontrer Fabien Potencier,Dustin Whittle,
Fabian Lange, Lambert Beekhuis, Nicolas Perriault et Ian Christian.

10 août – Kamelot Blog: Articles sur spl

J'ai envie de m'intéresser à la Standard PHP Librairy. J'ai cherché quelques tutos et références.

Tuto& articles

références

10 août – Nexen.net: Stocker des donnees hierarchisees dans une base de donnees

Il est fréquent d'avoir à stocker des données hiérarchisées comme une liste de catégories dans une base de données. Malheureusement, les bases de données relationnelles comme MySQL ne proposent pas de fonctions spécifiques pour ce type de structure. Je vous propose d'examiner, à travers un exemple, les différentes solutions qui sont disponibles.

10 août – Apprendre-PHP.com: Classe singleton d'accès aux SGBD intégrant PDO

J'ai commencé à créer ma propre classe d'accès aux bases de données car j'avais véritablement envie d'implémenter des interfaces telles que Iterator ou Countable. Seulement voilà, il existe déjà une classe de ce type native à PHP : PDO.

10 août – Nexen.net: Zorba-XQuery pour PHP

Image pour le titre du contenu
William Candillon nous signale le projet Zorba-Xquery, un processeur XQuery généraliste, qui satisfait aux normes du W3C (enfin, 99,40%). XQuery est le langage de traitement associé à XML : il permet de naviguer dans les données, de les rechercher, quelque soit le moteur de stockage sous-jaçent (un fichier XML, une base, un middleware).
Cette implémentation a été réalisée entièrement en C++, et s'interface avec de nombreux langage (Ruby, PHP).

10 août – Nexen.net: Supprimer les vieux doublons

Image pour le titre du contenu
J'ai été approché par un ami qui souhaitait ajouter une contrainte UNIQUE sur des données, et supprimer les doublons dans une table, en conservant uniquement les valeurs récentes. Il avait essayer plusieurs approches avec ALTER TABLE, mais avait rencontré des problèmes avec les anciennes valeurs.
Pour l'aider, je me suis basé sur ses premières pistes, puis j'ai pensé que je pourrais publier toutes les solutions ici.".
Au passage, un rappel : ALTER TABLE dispose d'une clause ORDER BY qui permet de classer les données, et IGNORE qui permet de traiter les erreurs de conversions de tables en les ignorant (c'est à dire, en supprimant les lignes qui sont associées).

11 août – Kamelot Blog: PEAR::Pager tutor : Navigation avec pagination et Javascript simple

Ce texte est une des traductions d'une série d'articles de Lorenzo Alberton

OK, vous ne pouvez pas résister à la tendance du Web 2.0 vous avez appris que tous que vous pourriez se renseigner sur cette « nouvelle » technologie appelée AJAX, et maintenant vous vous demandez comment vous pourriez vivre sans lui.

Tout le monde n'a pas sauté dans le mouvement, bien que, et beaucoup de bibliothèques existent toujours sans mettre en application ce dispositif, ainsi vous est confronté au dilemme :

Dois-je je continuer à employer que vieille bibliothèque et abandonner mes idées fraîches d'AJAX, ou devrais je mettre en application ma propre version ?

Si vous recherchez une classe de pagination avec ces conditions, je suis heureux de vous rassurer au sujet de PEAR::Pager : il est AJAX-ready, et a été depuis il y a longtemps.

garanti 100% buzzword-compliance !

Example #1 - Pagination et Javascript

D'abord, regardons un exemple simple sur la façon d'armer le paginateur pour créer des liens de Javascript.

Dans cet exemple plutôt simpliste, nous récupérons toutes les données dans les morceaux paginés, stockons chaque page dans un <div> et employons quelques scripting DOM pour cacher toutes les couches sauf la page courante.

@voir fonctionner cet exemple

[php]
<?php
require_once 'Pager/Pager.php';
$data = range(1, 100); //un tableau de données à paginer
$pager_params = array(
    'mode'     => 'Sliding',
    'append'   => false,  //ne pas ajouter les paramètres GET
    'path'     => '',
    'fileName' => 'javascript:revealDiv(%d)',  //Pager replaces "%d" with the page number...
    'perPage'  => 10, //afficher  10 item par page
    'delta'    => 5,
    'itemData' => $data,
);
$pager = & Pager::factory($pager_params);
$n_pages = $pager->numPages();
$links = $pager->getLinks();
?>
<html>
<head>
    <script type="text/javascript">
    var n_pages = <?php echo $n_pages ?>;
    function revealDiv(n)
    {
        for (var count = 1; count <= n_pages; count++) {
          document.getElementById("page"+count).style.display = 'none';
        }
        document.getElementById("page"+n).style.display = 'block';
    }
    </script>
    <style type="text/css">
    div.page {
      background: #FFFF99;
      border-top: 1px solid #FFBF99;
      border-bottom: 1px solid #FFBF99;
    }
    </style>
</head>
<body>
<h1>PEAR::Pager exemple with JavaScript</h1>
<?php echo $links['pages']; ?>
<hr />
<?php
for ($i=1; $i <= $n_pages; ++$i) {
    echo '<div class="page" id="page'.$i.'">';
    echo '<h2>Page '.$i.'</h2>';
    foreach ($pager->getPageData($i) as $item) {
        echo 'Item '.$item.'<br />';
    }
    echo '</div>';
}
?>
<hr />
<script type="text/javascript">
revealDiv(1);
</script>
</body>
</html>

à lire aussi

11 août – PHP Index: PHP 4.4.9 & PHP 5.3 Alpha1

L'équipe de développement de PHP vient d'annoncer la sortie de PHP 4.4.9. Cette version a pour but d'améliorer la stabilité de la branche 4.4.x.

Parmi les correctifs on notera :

  • La Mise à jour de PCRE version 7.7
  • La Correction de possibles crashes dans imageloadfont
  • La Correction de la fonction memnstr()
La liste complète des modifications apportées par PHP 4.4.9 est disponible dans le changelog.

A noter aussi, la sortie de PHP 5.3 Alpha1. Cette nouvelle version de PHP devrait améliorer la stabilité et les performances de la branche 5.x mais aussi apporter de nouvelles syntaxes au langage et à ses extensions. Plusieurs nouvelles fonctionnalités ont déjà été documentées dans la documentation officielle, d'autres sont répertoriées dans le wiki.

Télécharger PHP 5.3 Alpha1
Télécharger PHP 4.4.9

11 août – PHP Index: MySQL 5.0.67

Une nouvelle version de MySQL vient de voir le jour. Cette nouvelle version apporte quelques modifications parmi lesquelles :

  • L'ajout de la variable système plugin_dir
  • Le moteur de stockage FEDERATED est à présent désactivé par defaut
  • La mise à jour de REPAIR TABLE et de CHECK TABLE
Le changelog
Télécharger MySQL 5.0.67

11 août – Apprendre-PHP.com: Méthodes magiques : __set() et __get()

PHP a fait un grand pas en avant en matière de programmation orientée objet avec sa version 5. Depuis cette version, il permet d'implémenter des méthodes au comportement prédéfini par PHP. Ces méthodes sont appelées « méthodes magiques », les méthodes __set() et __get() en font partie.

11 août – Apprendre-PHP.com: Méthodes magiques : __call()

PHP a fait un grand pas en avant en matière de programmation orientée objet avec sa version 5. Depuis cette version, il permet d'implémenter des méthodes au comportement prédéfini par PHP. Ces méthodes sont nommées « méthodes magiques », __call() est l'une d'entre elles.

11 août – tigrou/pwet.fr: Optimiser son site sous Ubuntu : Configurer l'en-tête Expires

Lire un livre sur comment optimiser son site web c'est bien, appliquer les conseils qui s'y trouvent c'est encore mieux. Parmi les 14 bonnes pratiques, 3 peuvent être appliquées très rapidement au niveau système en quelques lignes de commande et de configuration du serveur web pour un résultat quasi immédiat :

Dans un premier temps, je vais m'intéresser à la règle 3, je suppose que vous avez déjà un serveur web Apache2 actif servant des fichiers (peu importe la technologie autour). La configuration suivante est utilisée sur ma Dedibox sous Ubuntu avec Apache2 mais doit pouvoir s'appliquer à peu près partout.

Ajoutez et configurez l'en-tête Expires

L'en-tête Expires indique quand un élément devra expirer du cache du navigateur; mettre une date d'expiration dans un futur lointain permet de maximiser l'utilisation du cache navigateur et donc d'éviter les téléchargements inutiles, ce qui est particulièrement utile pour les éléments statiques (images, feuilles de style, ...) qui ont tendances à changer ... peu fréquemment mais à ralentir l'affichage de la page si ils ne sont pas en cache. Pour ces éléments, il est possible de configurer l'expiration dans Apache avec le module expires . Pour les pages dynamiques ou éléments générés dynamiquement, c'est au script d'envoyer l'en-tête et sa valeur adéquate par exemple avec la fonction header() en PHP .

L'activation du module pour Apache2, il faut utiliser a2enmod avec la ligne suivante et ensuite recharger apache :

$ sudo a2enmod expires
$ sudo /etc/init.d/apache2 reload

Il reste alors à configurer ce module. Je stocke la configuration de ce module dans le fichier /etc/apache2/conf.d/expires dont voici le détail :

ExpiresActive On
ExpiresByType image/gif "access plus 30 days"
ExpiresByType image/jpg "access plus 30 days"
ExpiresByType image/jpeg "access plus 30 days"
ExpiresByType image/png "access plus 30 days"
ExpiresByType image/x-icon "access plus 30 days"
ExpiresByType text/css "access plus 30 days"
ExpiresByType application/x-javascript "access plus 30 days"

Tous les éléments statiques des types listés expirent 30 jours après leur premier téléchargement. Après un nouveau reload d'Apache, vous devriez voir apparaître l'en-tête Expires par exemple avec l'extension Firebug de Firefox au premier chargement des éléments de la page. Ensuite le navigateur utilisera son cache ce qui devrait accélérer l'affichage des pages suivantes utilisant les mêmes éléments.

11 août – Nexen.net: Liens de migration vers PHP 5

Image pour le titre du contenu
Avec PHP 4 définitivement mort et enterré (sniff), Gena01 a rassemblé les liens vers les articles en ligne qui aident à la migration depuis PHP 4 vers PHP 5. 8 liens avec de nombreux conseils, en attendant la prochaine version de PHP 5 avancé.

11 août – Nexen.net: Le monde merveilleux des moteurs MySQL

Image pour le titre du contenu
MySQL est composé de deux niveaux : le moteur SQL, qui gère les requêtes, et le moteur de stockage, qui assure la persistance des données. MyISAM et InnoDB sont les moteurs les plus connus, mais il y en a bien d'autres, généralistes ou spécialisés. Peter Zaitsev fait le point sur tous ces moteurs, leur utilité et leur degré de maturité. Vous retrouverez Maria, Falcon, InnoDB, MyISAM, PBXT, Solidb, memory, federated, blackhole et archive. Il y a aussi des comparatifs de performances.

11 août – Nexen.net: 5 navigations originales pour le Web

Image pour le titre du contenu
Smashing magazine revoit ses classiques, et extrait 5 navigations simples mais efficaces. Il y a la navigation verticale, avec déplacement de souris horizontal, les mois compactés à la Chris Shiflett, la navigation adjacente, les blocs de panneaux et les tags graphés. A chaque fois, un site d'exemple est présenté, ce qui montre une application directe du concept.
Et d'autres concepts avancés sont planifiés par le même site... mmmm.

12 août – Apprendre-PHP.com: Les classes abstraites et finales

PHP intègre un autre concept de la programmation orientée objet : les classes abstraites. Ce cours définit et introduit la notion de classes abstraites. Nous présenterons ce que sont les classes abstraites, à quoi elles servent au développement et comment les déclarer et les utiliser. Nous étudierons enfin le cas particulier des classes et méthodes finales qui participent à la sécurité du code en programmation orientée objet.

12 août – PHP Québec: 10/2 19:00 Rencontre Montréal, octobre

PHP Québec vous convie à la rencontre mensuelle du mois d'octobre.

En première partie, Jean-Pierre Lessard présentera eyeOS, une bibliothèque et application permettant de développer des applications web similaires à des applications de bureau.

En deuxième partie, Sylvain Racine nous fera une présentation de la base de données PostgreSQL, de ses outils d'administration, configuration, modules et language de programmation.

Vous aimeriez faire une présentation ou vous avez un sujet a proposer pour cette rencontre, veuillez contacter les organisateurs board@phpquebec.com

Confirmez votre présence sur :
FaceBook: http://www.facebook.com/home.php#/group.php?gid=2334604744
Upcoming : http://upcoming.yahoo.com/event/1100923/

Date : 2 Octobre 2008
Heure : 19h00
Lieu : École de technologie supérieure
Salle : B-4416
Metro: Bonaventure
Carte : http://www.etsmtl.ca/zone2/enbref/rendre.html
Ville : Montréal


Prochaines activités:
- 2 octobre PHP Québec
- 4-5 octobre codeFest 2.2
- 4-6 mars conférence PHP Québec

Inscrivez vous dès aujourd'hui à la conférence PHP Québec et bénéficiez de tarif de pré-vente.

12 août – PHP Index: Dotclear 2.0

Dotclear 2.0 est dès à présent disponible. Cette version apporte quelques nouveautés par rapport à la version 2.0 RC2.1 tel que :

  • Le rafraîchissement de l'apparence de l'interface d'administration avec le nouveau logo
  • La prévisualisation des billets directement en contexte
  • Un nouveau gestionnaire de langues avec possibilité d'ajouter des langues très facile