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

Mars 2007 – Digital Fashion: Mini Howto: Serveur et Packages PEAR

Pour installer le serveur PEAR, c'est simple:

pear channel-discover pear.chiaraquartet.net
pear install chiara/Chiara_PEAR_Server
pear run-scripts Chiara_PEAR_Server

Ensuite on répond aux question, et c'est automagique.

Après, pour créer des packages, ça se corse. Tout d'abord, on a besoin de PEAR_PackageFileManager:

pear install PEAR_PackageFileManager

Ensuite, le but est de générer les package.xml qui vont bien. Voilà comment j'ai procédé pour le package Zend:

mkdir -p ~/pear/zend/src && cd ~/pear/zend
wget http://framework.zend.com/download/tgz -O - | tar xzC ~
mv ~/ZendFramework-0.8.0/library/Zend* src/
php ./mkpkg.php make
cd src && pear package

Ceux qui ont bien suivi auront noté que mkpkg.php est sorti un peu de l'espace :-) Vous trouverez son contenu à la fin du billet.

Pour résumer, on créé un répertoire de travail (~/pear/zend/), dans lequel on créé un répertoire src, qui contiendra tous les fichiers du package, puis le script mkpkg.php se charge 1) d'analyser le contenu de src, et 2) de créer le package.xml qui va bien, selon les instructions qui lui sont fournies.

Nous disposons désormais d'un package Zend-0.8.0.tgz dans ~/pear/zend/src, que nous n'avons plus qu'a uploader via l'interface d'administration du serveur PEAR précédemment installé :-)

Le fichier mkpkg.php:

<?php

require_once('PEAR/PackageFileManager2.php');

PEAR::setErrorHandling(PEAR_ERROR_DIE);

$packagexml = new PEAR_PackageFileManager2;

$e = $packagexml->setOptions(array(
    'baseinstalldir' => '/',
    'packagedirectory' => dirname(__FILE__).'/src',
));

$packagexml->setPackage('Zend');
$packagexml->setSummary('Zend Framework');
$packagexml->setDescription('The Zend\'s PHP Framework');
$packagexml->setChannel('pear.phpmafia.net');
$packagexml->setAPIVersion('0.8.0');
$packagexml->setReleaseVersion('0.8.0');
$packagexml->setReleaseStability('devel');
$packagexml->setAPIStability('devel');
$packagexml->setNotes("Still a preview release");
$packagexml->setPackageType('php'); // this is a PEAR-style php script package
$packagexml->addRelease(); // set up a release section
$packagexml->setPhpDep('5.1.2');
$packagexml->setPearinstallerDep('1.4.0a12');
$packagexml->addMaintainer('lead', 'ash', 'Geoffrey Bachelet', 'geoffrey+pear@zubrowka.org');
$packagexml->setLicense('New BSD License', 'http://framework.zend.com/license/new-bsd');
$packagexml->generateContents(); // create the <contents> tag

$pkg = &$packagexml->exportCompatiblePackageFile1(); // get a PEAR_PackageFile object

if (isset($_GET['make']) || (isset($_SERVER['argv']) && @$_SERVER['argv'][1] == 'make')) {
    $pkg->writePackageFile();
    $packagexml->writePackageFile();
} else {
    $pkg->debugPackageFile();
    $packagexml->debugPackageFile();
}

?>

Mars 2007 – Prendre un Café: Splitgames carbure au Symfony

La nouvelle version du site internet Splitgames, dont j'ai activement participé au développement et à la mise en place de la plateforme technique dans le cadre d'une mission Clever Age, est en ligne (avec un peu de retard, mais quand on aime, on ne compte pas.)

Splitgames est une plateforme d'échange en ligne de jeux vidéos. Cette nouvelle version, entièrement refactorée par rapport à la précédente, repose sur la version 1.0 du framework Symfony, dont je vous parle régulièrement ici même. Preuve s'il en est que de sympathiques choses peuvent être accomplies avec cet outil.

Félicitations à tout ceux qui ont travaillé sur le projet !

PS: Les popups javascript en rollover, c'est pas moi :p

Mars 2007 – PHP Québec: Conférence PHP Québec : Certification PHP5 Gratuite!

L'équipe de PHP Québec est fière d'annoncer la cinquième édition de la Conférence PHP Québec. La conférence aura lieu les 14-15-16 mars 2007 à l'hôtel Sofitel de Montréal, Québec, Canada.

Notez que les tarifs régulier et membres prendront fin vendredi 10 mars 2007.

La conférence vous propose 3 jours de conférences et ateliers techniques avec les experts PHP tels que: Rasmus Lerdorf, Andrei Zmievski, Derick Rethans,
Ilia Alshanetsky, John Coggeshall, Damien Séguy et bien d'autres. Avec plus de 35 présentations techniques, la certifications PHP5 gratuit, les activités de réseautage; la conférence PHP Québec est un événement à ne pas manquer.

Inscrivez vous dès maintenant et profitez de nos tarifs avantageux.

Mars 2007 – PHP Québec: Conférence PHP Québec 2007 - Tirage d'un billet de conférence

Foo Associates, l'un des commanditaires de la Conférence PHP Québec 2007 propose une entré gratuite pour les 3 jours de conférences et ateliers (14-16 mars) ainsi qu'une entré à un événement réserver uniquement au conférenciers, commanditaires et organisateur de la conférence.

Ceci est une excellente opportunité pour rencontrer les acteurs principaux participant au développement de PHP.

Faite parvenir votre candidature avant lundi le 12 mars en anglais.

Bonne chance et au plaisir de vous rencontrer.
Yann Larrivée

Mars 2007 – tigrou/pwet.fr: Un truc amusant en PHP

Via Planet PHP et le blog de Ivo Jansch , j'ai découvert un truc marrant en PHP, on peut écrire des choses du type :

<?php
System.out.print("Je fais du Java en PHP ;-)");
I.need.to.get.some.sleep(1);
?>

Bon évidemment ça n'est pas recommandé et en plus ça n'a aucun intérêt :-) En fait techniquement ce comportement est normal. Le parser fait juste quelques notices car il interprète les instructions inconnues comme des constantes non définies...

Mars 2007 – tigrou/pwet.fr: Warning au lancement de scripts PHP4 en CLI

J'ai un warning pénible lors du lancement d'un script PHP4 en ligne de commande (CLI) sur ma Ubuntu Edgy Eft installée sur ma Dedibox . Rien de bien grave, mais à chaque lancement d'un script (au hasard un de ceux d'eZ Publish :-), j'ai le message suivant :

$ php4 update/common/scripts/cleanup.php -s plain_site_admin expired_session
PHP Warning:  mime_magic: type regex            BEGIN[[:space:]]*[{]    application/x-awk invalid in Unknown on line 0

Un moyen de supprimer ce message systématique trouvé sur Launchpad et sur l'outil de rapport de bug de Debian est d'aller commenter la ligne 273 du fichier /usr/share/file/magic.mime . Simple, un peu crade mais au moins ça marche et puis je ne pense pas que cette modification ait beaucoup d'impact sur le reste du système...

Mars 2007 – tigrou/pwet.fr: Mention automatique sur des images via Apache et PHP

Comme je l'indiquais dernièrement , j'ai décidé de placer mes photos et mes billets sous Licence Creative Commons CC-By-Sa ce qui implique de citer mon nom (ou je me contente de l'adresse d'origine du site) lors de l'utilisation de ces contenus. Mais je me rend compte en regardant mes statistiques générées avec AWStats que beaucoup de gens hotlink mes photos sur divers blogs , page myspace ou divers forums sans rien mentionner de leur provenance et ça m'énerve un peu... Alors bien sûr, je peux m'inscrire et rajouter les mentions nécessaires dans le topic du forum en question mais :

  1. c'est long et fastidieux ;
  2. parfois impossible ;
  3. bien souvent les administrateurs prennent peur et retirent purement et simplement l'image alors que je demande juste une simple et courte mention.

J'ai donc décider d'automatiser un peu le processus en utilisant quelques règles de Rewriting Apache et un simple script PHP qui ajoute un texte à la volée et met en cache les images hébergées sur ma Dedibox mais utilisées hors de pwet.fr . Je n'aime pas trop le procédé, mais je n'en vois pas d'autre...

Techniquement parlant, j'ai mis la configuration suivante dans mon fichier de configuration d'Apache :

RewriteCond %{HTTP_REFERER} !^$ [NC] 
RewriteCond %{HTTP_REFERER} !^http://.*pwet\.fr.*$ [NC] 
RewriteCond %{HTTP_REFERER} !^http://images\.google\..*$ [NC] 
RewriteRule .*\.jpg$ /hotlink.php?img=%{SCRIPT_FILENAME}&ref=%{HTTP_REFERER}

Ce qui signifie que lors de l'appel à une image si une URL référente est définie et n'est ni pwet.fr, ni Google Images alors l'image renvoyée est en fait traitée par un script.

Le script hotlink.php est un traitement qui ajoute un texte blanc en bas de l'image en fonction de la taille de l'image en utilisant les fonctions de traitements d'image de la bibliothèque GD .

Mars 2007 – Dur Comme Faire: Sentiment sur la certification PHP

J'ai obtenu la certification PHP à l'été 2005 dans le cadre d'une évaluation de celle-ci par l'AFUP. On me demande régulièrement ce que ça a changé pour moi. Je vais donc tenter de faire le point sur ce que m'a apporté l'obtention de cette certification. Avant toute chose, ma situation...

Mars 2007 – Digital Fashion: Zend Framework 0.9.0

La version 0.9 du ZF est disponible sur le channel PEAR phpmafia:

pear upgrade phpmafia/Zend-0.9.0

ATTENTION, cette version change pas mal de choses au niveau de la classe Zend: vos applis risquent de ne plus fonctionner suite à la mise à jour.

Voir aussi: L'annonce sur la mailing list Zend Announce

Mars 2007 – sahid.funraill.org: Pattern, Service Locator ou Registry en PHP

Le modÚle de conception Service Locator / Registry mis en situation dans un MVC

Introduction

Le Service Locator, est un pattern permettant la sauvegarde et la restitution d’objets, pour cela, il utilise un tableau par lequel il garde en memoire les objets. Dans une application utilisant le motif MVC, l’utilisation de registre apparait comme une bonne methode sachant que l’application est centrée sur un seul fichier, “index.php”.

Avant d’expliquer comment le mettre en oeuvre, on va d’abord le mettre en situation dans un cas concret.
Notre application est concue sur un modele MVC et tourne autour du fichier index.php.

Aborescence de notre application :

  • /app/controllers
  • /app/models
  • /app/views
  • /index.php

index.php

  1. <?php
  2. // charge le MVC
  3. require_once (“app/MVC.php”);
  4. // pattern Service Locator
  5. require_once (“app/ServiceLocator.php”);
  6.  
  7. try {
  8.         // Initialise le FC
  9.         $fc = new FrontController (“/app/controllers/”);
  10.        
  11.         // Initialisation du modele i18n
  12.         require_once (“/app/models/I18n.php”);
  13.         $i18n = new I18n (“fr_FR”, “i18n/”);
  14.        
  15.         // Sauvegarde du modele en registre
  16.         ServiceLocator::register (“i18n”, $i18n); //!\
  17.        
  18.         // Demarre l’appli
  19.         $fc->dispatch (new HttpRequest (), new View (“/app/views/”));
  20. } catch (Exception $e) {
  21.         echo $e->getMessage ();
  22.         die ();
  23. }
  24. ?>

On peut s’apercevoir que dans le fichier index.php on crée l’instance de notre modele I18n. Ensuite par l’intermediaire de ServiceLocator, on le place en registre.

Le controlleur : IndexAction.php

  1. <?php
  2. class IndexAction extends Controller
  3. {
  4.         public function doAction (HttpRequest $request, View $view) {
  5.                 try
  6.                 {
  7.                         // Recupere l’objet i18n enregistre en registre (:
  8.                         $i18n = ServiceLocator::registry (“i18n”);      //!\
  9.                        
  10.                         $i18n->setLangue (“en_US”);
  11.                         $view->bonjour = $i18n->__(‘bonjour_le_monde’);
  12.                         echo $view->render (“default.tpl.php”);
  13.                        
  14.                 } catch (Exception $e) {
  15.                         echo $e->getMessage ();
  16.                         die ();
  17.                 }
  18.         }
  19. }
  20. ?>

Maintenant on récupere notre objet afin de l’utiliser dans notre controlleur IndexAction.php. On remarque que notre application dispose d’une seule occurence I18n pouvant etre utilisée dans tout les controlleurs.

La classe Service Locator

Rien de compliqué dans cette classe, on se sert simplement de methodes et attributs statiques, le tout est de bien faire attention eviter les doublons, et retourner les bons messages d’erreur en cas d’une mauvaise utilisation de celui-ci.

  1. <?php
  2. class ServiceLocator
  3. {
  4.         static private $_registry = array ();
  5.  
  6.         /**
  7.          * Enregistre un objet dans le registre
  8.          *
  9.          * @param string $key
  10.          * @param objet $obj
  11.          */
  12.         static public function register ($key, $obj)
  13.         {
  14.                 // Verifie les doublons de clefs
  15.                 if (array_key_exists ($key, self::$_registry)) {
  16.                         throw new Exception (“La clef {$key} est deja enregisté.”);
  17.                 }
  18.                
  19.                 // Verifie s’il s’agit bien d’un objet
  20.                 if (!is_object ($obj)) {
  21.                         throw new Exception (“Vous pouvez enregister seulement des objets.”);
  22.                 }
  23.                
  24.                 // pas de probleme, on enregistre
  25.                 self::$_registry[$key] = $obj;
  26.         }
  27.        
  28.         /**
  29.          * Restaure un objet enregistré
  30.          *
  31.          * @param string $key
  32.          * @return objet
  33.          */
  34.         static public function registry ($key)
  35.         {
  36.                 if (!array_key_exists ($key, self::$_registry)) {
  37.                         throw new Exception (“Aucun objet enregistré sous ce nom”);
  38.                 }
  39.                
  40.                 return self::$_registry[$key];
  41.         }
  42. }
  43. ?>

L’utilisation de ce pattern est interessant car il permet d’eviter tout code superflu, et optimise un maximun l’application, dans le sens où on l’utilise la maniere d’un Singleton une seule instance de nos modeles, et cette instance est disponible partout dans notre application.

Mars 2007 – Digital Fashion: Zend Framework 0.9.1

Le ZF est sorti en version 0.9.1 et est dispo sur le channel pear.

Voir aussi:

Mars 2007 – PHP Québec: Rencontre Mensuel Montréal - MySQL Performance: Writing Optimized Queries'

After a brief break the Montreal PHP Quebec team is back on track and is pleased to invite you to it's monthly meetings that are held every first Thursday's of each month at ETS.

This month, Morgan Tocket, from the MySQL support team, will talk on 'MySQL Performance: Writing Optimized Queries'

In the second part, we will have a question & answer session. So bring your laptop and questions. Please send your questions to board@phpquebec.com

You would like to present to our monthly meetings, or you would like us to present on a specific topic? Send us an email at board@phpquebec.com


Date : April 5th 2007
Time : 19h00
Location : École de technologie supérieure
Room : B1510
Subway: Bonaventure
Map : http://www.etsmtl.ca/zone2/enbref/rendre.html
City : Montreal


=================================================


Après un cour repos, l'équipe de PHP Québec de Montréal est de retour en fource et vous invites aux rencontres mensuelles qui ont lieu tout les premiers Jeudi du mois dans les locaux de l'ETS.

En premiere parti, Morgan Tocker de l'équipe de support de MySQL présentera sur 'MySQL Performance: Writing Optimized Queries'. Cette présentation sera en anglais.

En deuxième parti, les visiteurs seront invités à exposer leur plus récents problèmes qu'ils ont expérimentés avec PHP et nous tenterons de les résoudrent. Faites parvenir vos questions à board@phpquebec.com

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

Date : 5 Avril 2007
Heure : 19h00
Lieu : École de technologie supérieure
Salle : B1510
Metro: Bonaventure
Carte : http://www.etsmtl.ca/zone2/enbref/rendre.html
Ville : Montreal

Mars 2007 – tigrou/pwet.fr: Captcha, vous avez dit Captcha ?

Aujourd'hui, je suis tombé sur Blogs & Pages perso référencement par département via le forum Webrankinfo , un annuaire du réseau 1Annuaire . On remarquera la page d'accueil qui clignote un peu partout (mais j'ai déjà vu bien bien pire), mais le plus marrant, c'est le formulaire d'inscription qui regroupe les champs habituels ainsi qu'un code de vérification à recopier, jusque là rien d'anormal, mais ce code est directement dans la page HTML, point de captcha illisible anti-ocr bariolé, trituré, barbouillé inefficace avec ça !

Je suis sûr que c'est hyper efficace contre les robots spammeurs :-)

Par curiosité, je suis aller voir le site 1Annuaire, j'ai beaucoup apprécié les liens vers les 870 pages de résultats en haut et en bas de page sur la recherche blog , très pratique pour se rendre à la page 652 . Amusant aussi de constater qu'on peut passer les variables indifféremment en POST ou en GET, ça laisse augurer des possibilités intéressantes aux script kiddies de passage.