Une faille de sécurité critique a été divulguée sur les versions 5 et 6 de Microsoft IIS au niveau du service FTP de l'application.
Du code relatif à ce problème a été publié sur le forum Milw0rm. Selon l'auteur de ce code, le hacker Kingcope, il serait possible d'exécuter à distance du code sur un serveur vulnérable. Microsoft prend la menace au sérieux et déclare dans un communiqué investiguer sur les détails de la vulnérabilité, en particulier au niveau du protocole FTP.
Il est conseillé, par mesure de précaution, de désactiver les accès anonymes en écriture sur le serveur FTP de IIS.
Plus d'informations : ZDNet.fr
Je voulais exécuter la tâche backupTask dans le module upload de mon appli backend.
En m’inspirant de ce qu’on trouve dans la doc de symfony (Run another task within a task?), j’ai ajouté ce bout de code dans mon module :
…
$dispatcher = sfContext::getInstance()->getEventDispatcher();
$formatter = new sfFormatter();
$taskBackup = new backupTask($dispatcher, $formatter);
$taskBackup->run();
…
Résultat : un joli message d’erreur « You must be in a symfony project directory ».
Ok, il faut forcément être à la racine de son projet pour lancer des tâches.
En jouant un peu avec chdir(), on s’en sort à peu près :
…
chdir(’..’);
$dispatcher = sfContext::getInstance()->getEventDispatcher();
$formatter = new sfFormatter();
$taskBackup = new backupTask($dispatcher, $formatter);
$taskBackup->run();
chdir(’web’);
…
(à ce propos, si vous avez une autre solution pour ici, n’hésitez pas, je suis preneur!)
Là, ma tâche est bien exécutée, par contre, mon appli n’aime pas trop être promenée comme ça dans le répertoire symfony et j’ai le droit a :
The template « indexSuccess.php » does not exist or is unreadable in « »
Hum.
Et pourtant, mon fichier apps/backend/modules/upload/templates/indexSuccess.php existe, si si!
Voici notre solution (pareil que tout à l’heure : si vous avez mieux, les commentaires sont ouverts!) :
…
chdir(’..’);
$dispatcher = sfContext::getInstance()->getEventDispatcher();
$formatter = new sfFormatter();
$taskBackup = new backupTask($dispatcher, $formatter);
$taskBackup->run();
chdir(’web’);
…
$this->redirect(’upload/index’);
A la fin de mon action, je redirige vers la page sur laquelle j’étais. Et ça marche. C’est p’tet pas propre, mais ça marche.
Hey there, it’s been a while, huh?
Today I gave a talk about Symfony best practices at the Symfony Day event in Cologne, Germany; you can get the slides on slideshare or directly browse them below:
The Symfony Day event has been purely awesomely incredibly well organized, many kudos and thanks to Interlutions and to all the attendees. You’re all great people. Thanks.

Ce billet intitulé 30 Symfony Best Practices, the slides from my talk at SymfonyDay Cologne '09 a été rédigé par Nicolas Perriault et publié sur le blog Prendre un Café sous licence Creative Commons BY-NC-SA.
Dans Zend Studio 7 :
Placez vous sur une variable, alt-shift-R changez son nom, et hop ca change partout. idem pour une propriété, une fonction, une méthode, ...
Samedi matin j'ai voulu essayer le mini script proposé par Ludovic Toinel sur son blog dans son article PHP : Récupérer la position d'un téléphone utilisant Google Latitude
De fil en aiguille j'en suis arrivé à ce script (incomplet) qui en montre un peu plus.
Dans la première partie, j'affiche cote-à-cote 2 carte similaires.
Ce qui m'ennuyait dans le script c'est qu'il faille connaître le user id latitude de l'utilisateur à afficher.
Alors j'ai cherché dans google profile. Et ... je n'ai pas trouvé. Mais j'ai quand même affiché les infos qu'on y trouve.
Voilà. J'ai bon espoir d'améliorer ce script quand j'aurai du temps à perdre, et de republier une nouvelle version.
J'ai par exemple envie de refactoriser le var_export_intelligent pour qu'il soit passé sur un itérateur, qu'il soit récursif et de plus en plus adapté a divers contenus. quitte à étendre Zend_Debug::Dump puisque c'est un peu son utilité.
Le résultat et le script dans la suite.
[php]
<?php
// Pour obtenir l'id user et pour activer ou désactiver : visit http://www.google.com/latitude/apps/badge
$googleLatitudeUser = '1234567890123456789';
// J'ai Zend_Framework et PEAR dans mon include_path.
require_once 'Zend/Http/Client.php';
require_once 'Zend/Json.php';
require_once 'Zend/Debug.php';
require_once 'Zend/Date.php';
$client = new Zend_Http_Client();
$client->setUri('http://www.google.com/latitude/apps/badge/api?user=-' . $googleLatitudeUser . '&type=json');
$client->request('GET');
/*
* Le flux JSON adhère à la spécification GeoJSON 1.0.
* En plus du point identifié par la latitude et la longitude,
* les propriétés GeoJSON comprennent les id, accuracyInMeters, timeStamp, reverseGeocode,
* photoUrl, photWidth, photoHeight, placardUrl, placardWidth, placardHeight de l’utilisateur.
*
* Pour les flux de partage du nom de la ville, la latitude et la longitude
* représentent le centre-ville et la précision est de 0.
* */
$response = $client->request();
if ($response->isError()) {
die($response->getStatus() . ": " . $response->getMessage());
}
$googleLatitude = Zend_Json::decode($response->getBody());
// le 0 c'est parce qu'on peu mettre user=[user1],[user2], ... dans la requête à l'api
$coordinates = $googleLatitude['features'][0]['geometry']['coordinates'];
$client->setUri('http://socialgraph.apis.google.com/otherme?q=moosh.be@gmail.com');
$client->request('GET');
$response = $client->request();
if ($response->isError()) {
die($response->getStatus() . ": " . $response->getMessage());
}
$googleSocialgraph = Zend_Json::decode($response->getBody());
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>Test de google Latitude & google profil</title>
</head>
<body lang="fr">
| Il est à <?php
echo $googleLatitude['features']['0']['properties']['reverseGeocode']?>
| Latitude <?php
echo $coordinates[0];
?>
| Longitude <?php
echo $coordinates[1];
?>
| Précision <?php
echo $googleLatitude['features']['0']['properties']['accuracyInMeters']?> mètres
| TimeStamp <?php
echo $googleLatitude['features']['0']['properties']['timeStamp']?>
= <?php
Une utilisation toute simple de Zend_Date
$date = new Zend_Date($googleLatitude['features']['0']['properties']['timeStamp'], Zend_Date::TIMESTAMP);
print $date;
?>
| <br>Photo du user :
<img
src="<?php
echo $googleLatitude['features']['0']['properties']['photoUrl']?>"
width="<?php
echo $googleLatitude['features']['0']['properties']['photoWidth']?>"
height="<?php
echo $googleLatitude['features']['0']['properties']['photoHeight']?>" />
Phylactère du user :
<img
src="<?php
echo $googleLatitude['features']['0']['properties']['placardUrl']?>"
width="<?php
echo $googleLatitude['features']['0']['properties']['placardWidth']?>"
height="<?php
echo $googleLatitude['features']['0']['properties']['placardHeight']?>" />
<br />
<a
href="http://www.google.com/latitude/apps/badge/api?user=-<?php
echo $googleLatitudeUser;
?>&type=kml"
style="color: #0000FF; text-align: left">Localisation KML</a>
|
<a
href="http://maps.google.com/maps?f=q&hl=fr&ie=UTF8&t=h&z=14&iwloc=A&ll=<?php
echo $coordinates[1]?>,<?php
echo $coordinates[0]?>"
style="color: #0000FF; text-align: left">Agrandir le plan</a>
<h2>Les cartes</h2>
La première c'est avec googlemap, la suivante directement via latitude
<h3>Satélite</h3>
<!-- Google Public Location Badge via GoogleMaps -->
<iframe width="500" height="350" frameborder="0" scrolling="no"
marginheight="0" marginwidth="0"
src="http://maps.google.com/maps?f=q&hl=fr&ie=UTF8&t=k&z=15&ll=<?php
echo $coordinates[1]?>,<?php
echo $coordinates[0]?>&output=embed"></iframe>
<!-- Google Public Location Badge -->
<iframe width="500" height="350" frameborder="0" scrolling="no"
marginheight="0" marginwidth="0"
src="http://www.google.com/latitude/apps/badge/api?user=-<?php
echo $googleLatitudeUser;
?>&type=iframe&maptype=satellite&hl=fr&z=15"></iframe>
<h3>Hybride</h3>
<!-- Google Public Location Badge via GoogleMaps -->
<iframe width="500" height="350" frameborder="0" scrolling="no"
marginheight="0" marginwidth="0"
src="http://maps.google.com/maps?f=q&hl=fr&ie=UTF8&t=h&z=15&ll=<?php
echo $coordinates[1]?>,<?php
echo $coordinates[0]?>&output=embed"></iframe>
<!-- Google Public Location Badge -->
<iframe width="500" height="350" frameborder="0" scrolling="no"
marginheight="0" marginwidth="0"
src="http://www.google.com/latitude/apps/badge/api?user=-<?php
echo $googleLatitudeUser;
?>&type=iframe&maptype=hybrid&hl=fr&z=15"></iframe>
<h3>Terrain</h3>
<!-- Google Public Location Badge via GoogleMaps -->
<iframe width="500" height="350" frameborder="0" scrolling="no"
marginheight="0" marginwidth="0"
src="http://maps.google.com/maps?f=q&hl=fr&ie=UTF8&t=t&z=15&ll=<?php
echo $coordinates[1]?>,<?php
echo $coordinates[0]?>&output=embed"></iframe>
<!-- Google Public Location Badge -->
<iframe width="500" height="350" frameborder="0" scrolling="no"
marginheight="0" marginwidth="0"
src="http://www.google.com/latitude/apps/badge/api?user=-<?php
echo $googleLatitudeUser;
?>&type=iframe&maptype=terrain&hl=fr&z=15"></iframe>
<h3>Routes</h3>
<!-- Google Public Location Badge via GoogleMaps -->
<iframe width="500" height="350" frameborder="0" scrolling="no"
marginheight="0" marginwidth="0"
src="http://maps.google.com/maps?f=q&hl=fr&ie=UTF8&t=r&z=15&ll=<?php
echo $coordinates[1]?>,<?php
echo $coordinates[0]?>&output=embed"></iframe>
<!-- Google Public Location Badge -->
<iframe width="500" height="350" frameborder="0" scrolling="no"
marginheight="0" marginwidth="0"
src="http://www.google.com/latitude/apps/badge/api?user=-<?php
echo $googleLatitudeUser;
?>&type=iframe&maptype=roadmap&hl=fr&z=15"></iframe>
<h2>Google Profile</h2>
<?php
foreach ($googleSocialgraph as $url => $data) {
echo '<h3><a href="' . $url . '">' . $url . '</a></h3><dl>';
foreach ($data['attributes'] as $attrName => $attrValue) {
echo '<dt>
' . $attrName . '
</dt>
<dd>
' . var_export_intelligent($attrValue, 1) . '
' . (($attrName == 'photo') ? '<img src="' . $attrValue . '" />' : '') . '
</dd>';
;
}
echo '</dl>';
unset($data['attributes']);
if (! empty($data))
var_export($data);
}
?>
<h2>Infos brutes, retournées par l'api</h2>
<?php
Zend_Debug::dump($googleLatitude, 'info json', 1);
Zend_Debug::dump($googleSocialgraph, 'info social', 1);
?>
à voir : <a href="http://www.google.com/latitude/">Latitude</a>
&
<a href="http://www.google.com/latitude/apps/badge">Latitude Badge</a>
</body>
</html>
<?php
function var_export_intelligent ($attrValue, $return)
{
if (is_integer($attrValue)) {
$val = $attrValue;
} elseif (is_string($attrValue) && (substr($attrValue, 0, 7) == 'http://') && (in_array(substr($attrValue, - 3, 3), array('jpg' , 'gif' , 'png')))) {
$val = '<img src="' . $attrValue . '" /> (' . $attrValue . ')';
} elseif (is_string($attrValue) && (substr($attrValue, 0, 7) == 'http://')) {
$val = '<a href="' . $attrValue . '">' . $attrValue . '</a>';
} elseif (is_string($attrValue)) {
$val = $attrValue;
} else {
$val = var_export($attrValue, 1);
}
if ($return) {
return $val;
} else {
echo $val;
}
}
?>
J’entends déjà : « Pourquoi utiliser memcached sous windows? C’est pas fait pour la prod. Windows! ».
Ok, ok, mais dites moi? Comment je vais faire pour développer mon appli qui utilise memcached avec mon WampServer préféré si je ne peux pas la tester?
Avant de rentrer dans le détail, voyons un peu ce qu’est memcached.
Memcached est un serveur de mémoire partagé développé par Danga Interactive permettant de mettre des objets de toute sorte en cache.
Pour simplifier, à partir d’un script PHP, vous allez pouvoir mettre des variables en mémoire et donc rendre ces variables persistantes et accessibles à tous vos autres scripts PHP. Vous pouvez bien sûr déjà faire cela avec d’autres extensions telle que APC qui vous offre une solution de mémoire partagée. Sauf qu’avec APC, votre mémoire partagée ne sera accessible que depuis votre serveur local.
Memcached sera accessible à toutes les machines de votre environnement de production et leur permettra ainsi de partager la même mémoire et donc le même cache.
Toujours pas convaincu de l’intérêt ou ca reste pas très clair?
Et bien prenons un exemple.
Vous avez développé un site international de vente en ligne de Bandanas. Vous avez une centaine de références. Le site marche pas mal, vous êtes seul sur votre marché (qui penserait à vendre des bandanas sur internet?), quelques centaines de milliers de visiteurs par jour, tout va bien. Pour gérer la charge, vous avez une infrastructure avec deux serveurs en front et un serveur de bases de données.
C’est alors que Madonna décide de relancer la mode des bandanas en en portant un dans son dernier clip. Britney et Rihanna (ca doit s’écrire comme ca) suivent, la mode prend, tout le monde veut son bandana pour se l’attacher autour du bras ou de la jambe (la classe hein…rigolez pas, ca pourrait arriver)!
Le trafic de votre site explose, votre module permettant d’ajouter des commentaires sur les articles est pris d’assaut, pour gérer la charge, vous ajoutez 3 serveurs supplémentaires.
Ca permet au site de souffler un peu mais vous vous rendez rapidement compte que cela ne suffit pas!
Vous faites donc du profiling sur votre code pour optimiser les performances de votre site et vous rendez compte que c’est la base de données qui pose problème. Trop de connexions, requêtes trop lentes, etc…mais vous ne pouvez pas vous en passer, les pages du site évoluent rapidement avec les commentaires, l’affichage du stock disponible, etc… et vous vous devez d’avoir des pages à jour.
Vous faites le calcul, 10 000 000 de pages du catalogue vues par heure, soit 100 000 pour chaque produit (100 produits) et au moins autant de requêtes sur la base.
Et c’est là qu’intervient memcached. Grâce à memcached, vous allez pouvoir mettre les informations sur les produits en cache dans votre mémoire partagée pour une durée prédéfinie, par exemple, 1 minute et ces informations seront accessibles à vos 5 frontaux sans avoir à faire de requête sur votre base de données.
Ainsi, en une heure et pour un produit donné, vous n’aurez plus que 60 requêtes (1 heure = 60 * 1 minute) pour afficher la page du produit en question et des temps de réponse bien meilleurs (la mémoire est bien plus rapide que la base de données).
Vous serez donc passé de 100 000 requêtes par heure à 60! La contrepartie est que vos pages ne seront mises à jour que toutes les minutes.
Bien sûr, ceci n’est qu’un exemple d’utilisation de memcached, cette solution peut s’avérer utile dans bien d’autres cas (le plus connu étant le partage des fichiers de session sur une architecture avec répartition de charge).
ALORS COMMENT ON L’UTILISE?
La première étape va consister à installer notre serveur memcached. Plusieurs portages de memcached sur Windows existent sur le net, personnellement je vais utiliser une version beta mais plutôt à jour qui fonctionne bien et que vous pourrez trouver sur ce site : http://splinedancer.com/memcached-win32/.
Donc téléchargez les binaires (sous la forme d’un fichier zip), décompressez les et mettez le tout dans un répertoire « c:\memcached » sur votre machine.
Vous devriez maintenant avoir :
c:\memcached\memcached.exe
Vous allez avoir deux façons de le lancer.
Sous la forme d’un service :
c:\memcached\memcached.exe -d install
c:\memcached\memcached.exe -d start
Ou ponctuellement en double cliquant dessus.
Maintenant que notre serveur est lancé, nous allons pouvoir l’attaquer à partir de PHP.
Pour cela nous devons commencer par installer et activer l’extension php_memcache.dll.
Si vous utilisez WampServer avec une version de PHP < 5.3.0, l'extension est fournie par défaut (elle fait partie de PECL).
Si vous utilisez PHP 5.3.0 ou supérieur, il vous faudra télécharger l'extension à cette adresse :
http://downloads.php.net/pierre/
Activez l'extension via le menu de WampServer ou en modifiant votre fichier php.ini et le tour est joué.
Vous allez maintenant pouvoir lire et écrire dans memcached.
Sur votre serveur local :
< ?php
// on se connecte
$memcache = new Memcache();
$memcache->connect(’localhost’, 11211) or die (’impossible de se connecter’);
//on écrit avec une validité de 10 secondes
$test = ‘du texte’;
$memcache->set(’test’, $test, False, 10) or die (’echec sur ecriture’);
//on lit
echo $memcache->get(’test’);
?>
Maintenant essayez le script ci-dessous sur un autre serveur de votre réseau local en remplaçant XXX.XXX.XXX.XXX par l’adresse IP de votre premier serveur :
< ?php
// on se connecte
$memcache = new Memcache();
$memcache->connect('XXX.XXX.XXX.XXX', 11211) or die ('impossible de se connecter');
//on lit
echo $memcache->get('test');
?>
Si vous avez exécuté le premier script moins de 10 secondes avant le deuxième, vous verrez le contenu de la variable s’afficher. Au bout de 10 secondes, la variable n’est plus bonne, vous ne pourrez donc plus y accéder.
ET APRES?
Ces exemples sont très pauvres et intentionnellement simplifiés (memcache permet de gérer des pools de serveurs, être utilisé comme gestionnaire de sessions, gérer la compression, etc…) mais quoi qu’il en soit, l’utilisation de memcache est très simple et se limite à une vingtaine de méthodes.
si vous voulez plus d’infos sur l’utilisation de memcache, consultez la doc de PHP
J’entends déjà : « Pourquoi utiliser memcached sous windows? C’est pas fait pour la prod. Windows! ».
Ok, ok, mais dites moi? Comment je vais faire pour développer mon appli qui utilise memcached avec mon WampServer préféré si je ne peux pas la tester?
Avant de rentrer dans le détail, voyons un peu ce qu’est memcached.
Memcached est un serveur de mémoire partagé développé par Danga Interactive permettant de mettre des objets de toute sorte en cache.
Pour simplifier, à partir d’un script PHP, vous allez pouvoir mettre des variables en mémoire et donc rendre ces variables persistantes et accessibles à tous vos autres scripts PHP. Vous pouvez bien sûr déjà faire cela avec d’autres extensions telle que APC qui vous offre une solution de mémoire partagée. Sauf qu’avec APC, votre mémoire partagée ne sera accessible que depuis votre serveur local.
Memcached sera accessible à toutes les machines de votre environnement de production et leur permettra ainsi de partager la même mémoire et donc le même cache.
Toujours pas convaincu de l’intérêt ou ca reste pas très clair?
Et bien prenons un exemple.
Vous avez développé un site international de vente en ligne de Bandanas. Vous avez une centaine de références. Le site marche pas mal, vous êtes seul sur votre marché (qui penserait à vendre des bandanas sur internet?), quelques centaines de milliers de visiteurs par jour, tout va bien. Pour gérer la charge, vous avez une infrastructure avec deux serveurs en front et un serveur de bases de données.
C’est alors que Madonna décide de relancer la mode des bandanas en en portant un dans son dernier clip. Britney et Rihanna (ca doit s’écrire comme ca) suivent, la mode prend, tout le monde veut son bandana pour se l’attacher autour du bras ou de la jambe (la classe hein…rigolez pas, ca pourrait arriver)!
Le trafic de votre site explose, votre module permettant d’ajouter des commentaires sur les articles est pris d’assaut, pour gérer la charge, vous ajoutez 3 serveurs supplémentaires.
Ca permet au site de souffler un peu mais vous vous rendez rapidement compte que cela ne suffit pas!
Vous faites donc du profiling sur votre code pour optimiser les performances de votre site et vous rendez compte que c’est la base de données qui pose problème. Trop de connexions, requêtes trop lentes, etc…mais vous ne pouvez pas vous en passer, les pages du site évoluent rapidement avec les commentaires, l’affichage du stock disponible, etc… et vous vous devez d’avoir des pages à jour.
Vous faites le calcul, 10 000 000 de pages du catalogue vues par heure, soit 100 000 pour chaque produit (100 produits) et au moins autant de requêtes sur la base.
Et c’est là qu’intervient memcached. Grâce à memcached, vous allez pouvoir mettre les informations sur les produits en cache dans votre mémoire partagée pour une durée prédéfinie, par exemple, 1 minute et ces informations seront accessibles à vos 5 frontaux sans avoir à faire de requête sur votre base de données.
Ainsi, en une heure et pour un produit donné, vous n’aurez plus que 60 requêtes (1 heure = 60 * 1 minute) pour afficher la page du produit en question et des temps de réponse bien meilleurs (la mémoire est bien plus rapide que la base de données).
Vous serez donc passé de 100 000 requêtes par heure à 60! La contrepartie est que vos pages ne seront mises à jour que toutes les minutes.
Bien sûr, ceci n’est qu’un exemple d’utilisation de memcached, cette solution peut s’avérer utile dans bien d’autres cas (le plus connu étant le partage des fichiers de session sur une architecture avec répartition de charge).
ALORS COMMENT ON L’UTILISE?
La première étape va consister à installer notre serveur memcached. Plusieurs portages de memcached sur Windows existent sur le net, personnellement je vais utiliser une version beta mais plutôt à jour qui fonctionne bien et que vous pourrez trouver sur ce site : http://splinedancer.com/memcached-win32/.
Donc téléchargez les binaires (sous la forme d’un fichier zip), décompressez les et mettez le tout dans un répertoire « c:\memcached » sur votre machine.
Vous devriez maintenant avoir :
c:\memcached\memcached.exe
Vous allez avoir deux façons de le lancer.
Sous la forme d’un service :
c:\memcached\memcached.exe -d install
c:\memcached\memcached.exe -d start
Ou ponctuellement en double cliquant dessus.
Maintenant que notre serveur est lancé, nous allons pouvoir l’attaquer à partir de PHP.
Pour cela nous devons commencer par installer et activer l’extension php_memcache.dll.
Si vous utilisez WampServer avec une version de PHP < 5.3.0, l'extension est fournie par défaut (elle fait partie de PECL).
Si vous utilisez PHP 5.3.0 ou supérieur, il vous faudra télécharger l'extension à cette adresse :
http://downloads.php.net/pierre/
Activez l'extension via le menu de WampServer ou en modifiant votre fichier php.ini et le tour est joué.
Vous allez maintenant pouvoir lire et écrire dans memcached.
Sur votre serveur local :
< ?php
// on se connecte
$memcache = new Memcache();
$memcache->connect(’localhost’, 11211) or die (’impossible de se connecter’);
//on écrit avec une validité de 10 secondes
$test = ‘du texte’;
$memcache->set(’test’, $test, False, 10) or die (’echec sur ecriture’);
//on lit
echo $memcache->get(’test’);
?>
Maintenant essayez le script ci-dessous sur un autre serveur de votre réseau local en remplaçant XXX.XXX.XXX.XXX par l’adresse IP de votre premier serveur :
< ?php
// on se connecte
$memcache = new Memcache();
$memcache->connect('XXX.XXX.XXX.XXX', 11211) or die ('impossible de se connecter');
//on lit
echo $memcache->get('test');
?>
Si vous avez exécuté le premier script moins de 10 secondes avant le deuxième, vous verrez le contenu de la variable s’afficher. Au bout de 10 secondes, la variable n’est plus bonne, vous ne pourrez donc plus y accéder.
ET APRES?
Ces exemples sont très pauvres et intentionnellement simplifiés (memcache permet de gérer des pools de serveurs, être utilisé comme gestionnaire de sessions, gérer la compression, etc…) mais quoi qu’il en soit, l’utilisation de memcache est très simple et se limite à une vingtaine de méthodes.
si vous voulez plus d’infos sur l’utilisation de memcache, consultez la doc de PHP
Romain explique tout ici Utilisation de memcached sous Windows avec WampServer
Mais petite précision pour les utilisateurs de vista.
Quand vous arrivez à l'étape
Vous allez avoir deux façons de le lancer.
Sous la forme d’un service :
c:\memcached\memcached.exe -d install c:\memcached\memcached.exe -d start
Ou ponctuellement en double cliquant dessus.
Pensez à donner les droits auparavant.

Et vous pouvez reprendre la suite de l'article
Après de nombreux mois d'absence, et une très forte demande des lecteurs du site NEXEN.NET, la newsletter de la semaine du site est de nouveau revenue.
Le redémarrage de cette activité a été relancé début septembre 2009 et elle va être régulière.
Pour consulter les anciennes newsletters : http://www.nexen.net/lettre/archives/index.php
Pour vous abonner à cette newsletter cliquer ici
Le scripts Javascript (avec ou sans AJAX d’ailleurs) sont imbuvables. N’espérez pas qu’ils soient facilement maintenables, c’est très difficile dès le moment où vous commencer à utiliser de l’AJAX. Si vous devez vous replonger dedans, ça sera la croix et la bannière pour comprendre le code. À la clef, une énorme perte de temps et des maux de têtes.
L’architecture XRX : la fin du développement web douloureux
Et mince, notre prochaine appli (basée sur symfony 1.2.8) utilisant énormément de javascript va bientôt passer en prod… :-p
Depuis quelques jours, je reçois de nombreuses demandes concernant le Forum PHP 2009 organisé par l'AFUP (Association Française des Utilisateurs PHP) en partenariat avec LeMug.Fr (MySQL User Group).
Pour rappel, cet évènement se déroulera le 12 et 13 novembre prochain à la cité des sciences à Paris. Les conférences vont être dévoiler dans très peu de temps donc encore un tout petit peu de patience mais cette année comme les autres années, la qualité sera présente.
Les inscriptions sont ouvertes depuis de nombreux mois et vous pouvez :
Alors n'hésitez pas à vous inscrire sur le lien suivant : cliquer ici Ou en consultant le site officiel de AFUP : http://afup.org/pages/forumphp2009/
A très bientôt
Webinar Zend Technologies US
If you’re using PHP components provided by others, or if you’re creating components others may use, you don’t want to miss our technical Webinar on Namespaces in PHP 5.3.
Join Stas Malyshev, a core PHP contributor, and Michael Spector from Zend’s R&D team to learn what namespaces are and how to make the most out of them.
Mardi 15 septembre à 18h. Heure française.
Proposé par Christophe Chervy
Petit souci que je viens d’avoir en local (windows XP + wamp 2.0 + symfony 1.2.8 + Firefox 3.5.3 + Firebug 1.4.2 + FireSymfony 1.1.1) : les logs symfony récupérés par FireSymfony n’affichaient plus rien du tout.
La raison? C’est parce que FireSymfony était ouvert quand je faisais F5 sur mon application.
Il faut donc actualiser le projet symfony avec le panneau de FireSymfony fermé.
Petite question à ceux qui ont testé ce plugin Firefox : si vous naviguez sur votre appli symfony avec le panneau FireSymfony ouvert, est-ce que les logs sont toujours bien affichés? Car c’est un peu gênant de toujours devoir fermer FireSymfony pour actualiser…
Je ne peux pas faire ce test, car on navigue sur notre appli en AJAX (et donc on ne refraichit pas notre page) et je n’ai pas d’autres applis symfony sous la main.
Ajouté le 16-09-2009 : le bug est corrigé, il faut télécharger la prochaine version (expérimentale pour l’instant) qui se trouve ici. Thank you Alvaro!
I’m currently working on a big Symfony project, with a lot of Doctrine models and complex queries to write. I found a way to organize all of them in an object-oriented and cleaner way than using the traditionnal addNamedQuery() and createNamedQuery() methods workflow[1].
The idea is to create dedicated query classes for a given model ; this way, you can provide useful methods to build the business-related parts of your query.
As usual, the theory is more understandable with a concrete example. Let’s consider this simple Doctrine model[2] :
Disclaimer: The provided examples have been written in a hurry, so mistakes might have been not detected by my attentive proof-reading 
BlogAuthor:
columns:
id:
type: integer(4)
primary: true
autoincrement: true
name:
type: string(255)
relations:
Post:
type: one
class: BlogPost
local: id
foreign: author_id
BlogPost:
columns:
id:
type: integer(4)
primary: true
autoincrement: true
author_id:
type: integer(4)
notnull: true
title:
type: string(255)
content:
type: string(65535)
relations:
Author:
type: one
class: BlogAuthor
local: author_id
foreign: id
Comments:
type: many
class: BlogComment
local: id
foreign: post_id
BlogComment:
columns:
id:
type: integer(4)
primary: true
autoincrement: true
post_id:
type: integer(4)
notnull: true
author:
type: string(255)
content:
type: string(5000)
relations:
Post:
type: one
class: BlogPost
local: post_id
foreign: id
Now let’s imagine a Query class dedicated to query the BlogPost table:
<?php class BlogPostQuery extends Doctrine_Query { static public function create($conn = null, $class = null) { return parent::create($conn, 'BlogPostQuery') ->from('BlogPost p'); } public function addPosts($fields = 'p.*') { return $this->addSelect('p.*'); } public function addComments($fields = 'c.*') { return $this ->addSelect($fields) ->leftJoin('p.Comments c') ->addGroupBy('c.id'); } public function addAuthors($fields = 'a.*') { return $this ->addSelect($fields) ->leftJoin('p.Author a') ->addGroupBy('a.id'); } public function addCommentsCount($alias = 'nb_comments') { return $this ->addSelect(sprintf('COUNT(c.id) as %s', $alias)) ->addGroupBy('c.id'); } public function filterByAuthorName($authorName) { return $this ->andWhere('a.name = ?', $authorName); } }
So how can we use this query object? Here are some sample uses:
// Retrieve all posts $posts = BlogPostQuery::create() ->addPosts() ->fetchArray(); // Retrieve all posts with comments $posts = BlogPostQuery::create() ->addPosts() ->addComments() ->fetchArray(); // Retrieve all posts with comments and their count per post $posts = BlogPostQuery::create() ->addPosts() ->addComments() ->addCommentsCount('yataa') ->fetchArray(); // Retrieve all post with chuck as its author and related comments $posts = BlogPostQuery::create() ->addAuthors() ->addPosts() ->addComments() ->filterByAuthorName('chuck') ->fetchArray(); // and so on...
Of course, this example of use is not really relevant as our model is really simple, but when you’re dealing with dozens of internationalized objects, it can help cleaning your model classes, controllers and improving the organization of your work.
Some people are having negative feedback regarding this technique, claiming it will encourage people using the custom query object directly in the controllers; that’s absolutely not the case as the queries are to be used only within the model layer, for example in the BlogPostTable class:
<?php class BlogPostTable extends Doctrine_Table { static public function getPostsWithCommentsByAuthor($authorName) { return BlogPostQuery::create() ->addPosts() ->addComments() ->filterByAuthorName($authorName) ->fetchArray() ; } }
And in a controller:
class blogActions extends sfActions { public function executeListByAuthor(sfWebRequest $request) { $this->posts = BlogPostTable::getPostsWithCommentsByAuthor($request->getParameter('author')); } }
[1] … or raw queries written directly within controllers, but you may know that this is really bad 
[2] I’m using Doctrine 1.2 beta (bundled with upcoming symfony 1.3) in the provided example.
Ce billet intitulé Optimize your Doctrine Workflow with Specialized Queries a été rédigé par Nicolas Perriault et publié sur le blog Prendre un Café sous licence Creative Commons BY-NC-SA.
Le nouveau numéro de PHP solution vient de sortir avec comme d'habitude de nombreux articles parlant de PHP et MySQL. avec comme sommaire :
Virtualisation : LAMP à ma portée !
Dans ce numéro, vous pourrez trouver :
PHP 5.2.11 est disponible au téléchargement.
Cette nouvelle version concerne la branche 5.2.x ; elle apporte des correctifs de bugs ainsi que quelques mises à jour de sécurité.
Après avoir testé FireSymfony, je me suis penché vers FirePHP pour voir si débugguer mon appli symfony utilisant une navigation full ajax (et donc forcément, sans jamais recharger quoique ce soit) serait plus évident.
Car l’inconvénient de FireSymfony, c’est que rien n’est affiché dans les logs quand on fait des appels au serveur en ajax (finalement, la debug bar de symfony ne le fait pas non plus).
C’est possible que je me trompe, et si on peut afficher les logs des requêtes envoyées en ajax avec FireSymfony, dites-moi comment faire
, merci!
Toujours est-il qu’avec FirePHP, c’est possible. Comment?
Forcément, il faut Firefox (3.5.3 chez moi) avec Firebug (1.4.2) et donc FirePHP (0.3.1), disponible ici.
Installez ensuite le plugin symfony sfFirePHPPlugin avec la commande qui va bien
php symfony plugin:install sfFirePHPPlugin
Après un petit
php symfony plugin:publish-assets
pour déployer les fichiers web au bon endroit, ajoutez ce bout de code dans votre fichier apps/frontend/config/factories.yml :
dev: logger: class: sfAggregateLogger param: level: debug loggers: sf_fire_php: class: sfFirePHPLogger param: level: debug processor: http://localhost/sfFirePHPPlugin/js/RequestProcessor.js #make sure this is absolute
(euh pour l’indentation du fichier YML, allez voir là, c’est mieux fait!)
Activez Firebug, allez dans l’onglet Réseau et cliquez sur l’icône de FirePHP située à droite (un insecte bleu), puis « Allowed sites… ». Ajoutez-y votre site de dév.
Un petit php symfony cc pour tout bien nettoyer comme il faut, et c’est tout bon.
Pour débugguer votre appli, terminés les var_dump et les echo, voici le code nécessaire :
$firephp = sfFirePHP::getInstance(true);
$firephp->fb($this->maVar, 'ma variable');
// C'est possible de grouper des dump dans l'affichage de FirePHP
$firephp->group('debut du groupe');
$firephp->fb($this->maVar2, 'ma variable 2');
$firephp->fb($this->maVar3, 'ma variable 3');
$firephp->groupEnd();
Si vous avez d’autres solutions pour débugguer comme il faut une application ajax, n’hésitez pas à me soumettre vos propositions!
Le programme du forum PHP 2009 organisé par l'AFUP (association Française des Utilisateurs de PHP) vient d'être dévoilé en partenariat avec LeMug.fr (MySQL User Group).
Pour rappel, cette 9ème édition va se dérouler le 12 et 13 novembre 2009 à la Cité des Sciences de Paris.
Cette année, de nombreuses têtes d'affiches internationales vont faire le déplacement comme Michael "Monty" Widenius, Zoe Slattery, Anna Filina, Johannes Schlüter... ainsi que nos experts francophones.
Une occasion rêvée d'aborder les retours d'expériences et aussi des aspects techniques.
Pour connaître exactement le contenu, consulter le communiqué officiel
Proposé par christophe Villeneuve
Les versions 6.14 et 5.20 du CMS Drupal viennent de sortir. Elles corrigent des importantes failles de sécurité ainsi que les bugs signalés en utilisant l'outil de suivi des problèmes de Drupal.
La mises à jour des sites faits avec Drupal 5 et 6 est fortement recommandée.
La liste complète des modifications entre la version 6.13 et 6.14 peut être consultée ici. Celle entre les versions 5.19 et 5.20, ici.
Ces deux nouvelles versions sont sorties suite au report des problèmes de sécurité décrits sur le site officiel. La correction de ces failles de sécurité peut se faire soit par une mise à jour du CMS, soit par un patch. La première solution est préférable, car elle contient en plus la correction d'autres bugs.
Pour effectuer les corrections sur vos sites, vous pouvez télécharger :
ANEMA vient de publier Ganesha LMS 4.5, plate-forme e-learning en PHP/MySQL
Toute l'équipe d'ANEMA est fière de vous annoncer que la version Ganesha 4.5 est disponible depuis lundi 21 septembre 2009 en téléchargement sur www.ganesha.fr.
Ganesha LMS est la plate-forme e-learning open source de référence en France pour la formation des salariés d'entreprise.
Ce logiciel est un LMS (Learning Management System) qui permet aux services de formation d'entreprise de former leurs collaborateurs à distance ou en centre de ressources.
ANEMA édite ce logiciel depuis 2001 et propose un ensemble de services : hébergement, maintenance, formation, développement de fonctionnalités, etc.
La nouvelle version 4.5 de Ganesha LMS est une évolution importante, voici les principales nouveautés:
Le système d'alerte
Le système de relance
Le système de notification
L'import de présentation
Affichage plein écran du contenu sans fenêtre popup
De nouvelles vue statistiques
Des améliorations sur les codes d'inscriptions en ligne, l'ergonomie, la personnalisation de la terminologie
Ganesha LMS s'offre une nouvelle personnalisation graphique le skin green IT.
A télécharger sur http://www.ganesha.fr/
L'équipe ANEMA
Proposé par Marc VINCENT
La nouvelle Simple API pour les services d’applications Cloud facilite le développement d’applications Cloud Computing qui peuvent ainsi accéder aux principales plateformes Cloud.
CUPERTINO, Californie – 22 septembre 2009 – Zend Technologies, The PHP Company, a lancé ce jour le projet « Simple API for Cloud Application Services », une nouvelle initiative Open Source qui permet aux développeurs d’utiliser les services d’applications Cloud les plus répandus tout en leur permettant de bénéficier des fonctionnalités proposées par les fournisseurs individuels. Ce projet a pour but de faciliter le développement d’applications Cloud qui peuvent désormais accéder aux services des principales plateformes Cloud.
Zend, IBM, Microsoft, Nirvanix, Rackspace et GoGrid sont co-fondateurs et contributeurs de ce projet communautaire.
Ce projet permet aux développeurs d’utiliser une interface unique afin d’interagir avec différents services Cloud et d’accéder plus facilement aux nouvelles technologies des fournisseurs de services Cloud. Les premiers livrables incluront des interfaces pour le file storage, le document database, et les simple queue services via des plateformes telles que Amazon Web Services, Windows Azure, Nirvanix Storage Delivery Network et Rackspace Cloud Files. Les développeurs peuvent ainsi déployer des applications logicielles qui peuvent accéder à des services disponibles dans ces environnements sans perdre de temps ou changer leur code source de façon importante.
« Le Cloud Computing offre une importante valeur aux entreprises de toutes tailles, mais le manque de portabilité qui existait entre les services Cloud, même pour les opérations les plus simples, a été un frein pour l’adoption des services Cloud, a déclaré Andi Gutmans, CEO de Zend Technologies. »
« L’API Simple Cloud combine les avantages des processus de la communauté Open Source avec la participation active des fournisseurs de services Cloud » continue Andi Gutmans. « Grâce à la participation et au support en amont des leaders de l’industrie et de la communauté Zend Framework, nous sommes sûrs que ce projet va grandir et aider de nombreux développeurs et entreprises qui souhaitent construire des applications Web modernes pour le Cloud. »
Le projet Simple Cloud API est conçu pour encourager la participation et les contributions actives de la communauté Open Source, avec pour résultat la mise à disponibilité de connecteurs Simple Cloud API pour tous les fournisseurs de services Cloud.
Bien que ce projet soit mené par Zend, la plus grande entreprise contributrice au langage PHP, l’API Simple Cloud peut être traduite vers n’importe quel langage Web orienté objet. L’implémentation PHP sera disponible via le Zend Framework, projet Open Source très largement adopté, en tant que nouveau composant, nommé « Zend Cloud ». Les développeurs PHP pourront bénéficier de ce nouveau composant pour utiliser les bibliothèques clients disponibles dans le Zend Framework de façon uniforme.
Les connecteurs Zend Cloud seront disponibles pour des services tels que :
- Les services de stockage de données, y compris les Windows Azure blobs, Rackspace Cloud Files, Nirvanix Storage Delivery Network et Amazon S3
- Document Storage services, y compris Windows Azure tables et Amazon SimpleDB
- Les services de gestion de file d’attente, y compris Amazon SQS et Windows Azure queues
Zend Cloud va également fournir des connecteurs pour des services locaux pour rendre l’écriture de code et le test en mode déconnecté sur des services Cloud aussi facile que le développement en mode connecté.
D’autres connecteurs, tels que ceux disponibles pour Rackspace Cloud Files API, fonctionneront avec des librairies externes sans changement dans le code applicatif. En plus des librairies PHP client dans Windows Azure Storage, Microsoft contribue également aux connecteurs Simple Cloud API du Zend Framework. Ces connecteurs permettront aux applications de bénéficier des fonctionnalités Windows Azure via l’interface de l’API Simple Cloud, et donneront accès aux dernière innovations telles que les transactions et l’upload partiel.
Dr. Kristof Kloeckner, CTO d’IBM Cloud Computing, reconnait cet effort comme une étape significative vers un Cloud plus ouvert et interopérable. « L’API Simple Cloud va permettre aux développeurs d’appeler des services Cloud de la même façon quel que soit le fournisseur de service. » Ceci peut réduire considérablement les coûts de développement et fournir un certain choix au client. Dans ce but, IBM contribuera à fournir des connecteurs pour les interfaces des services Cloud d’IBM, permettant ainsi aux développeurs de switcher entre les Clouds publics, privés et les environnements datacenter traditionnels. »
« Microsoft est heureux de continuer à travailler avec Zend et de se joindre aux efforts des autres contributeurs de ce projet. » a déclaré Doug Hauger, General Manager, Microsoft Windows Azure. « L’API Simple Cloud est un exemple de l’investissement continu de Microsoft dans l’ouverture et l’interopérabilité de cette plateforme. Nous sommes impatients de voir comment ce projet va favoriser l’adoption des plateformes de Cloud Computing par les développeurs PHP et espérons que nombre d’entre eux seront encouragés à utiliser Windows Azure. »
Lew Moorman, Chief Strategy Officer et Président de Rackspace Cloud, ajoute : « Nous sommes fiers de prendre part à cette initiative de grande valeur pour les développeurs. Nos contributions à l’API Simple Cloud sont une partie de notre effort constant qui consiste à apporter une valeur unique aux logiciels Open Source au sein du Cloud. De nombreux clients utilisent PHP comme langage de référence pour leurs applications Web, et nous pensons que ces développeurs doivent être à même de pouvoir choisir les services Cloud qui correspondent le mieux à leurs besoins via une interface qu’ils peuvent aider à définir. »
Une première proposition et implémentation de référence de l’API Simple Cloud est disponible dès maintenant pour être évaluée par la communauté et afin qu’elle puisse participer sur http://www.simplecloud.org/. Les développeurs peuvent également évaluer la Simple API for Cloud Application Services en déployant leurs applications qui l’utilisent sur le Cloud Amazon en se servant de la Zend Server Community Edition Amazon Machine Image (AMI) pour EC2 disponible gratuitement. Zend Technologies offre également un support commercial pour Zend Server AMI. Une préversion des bibliothèques PHP clients pour Windows Azure peut être téléchargée sur http://framework.zend.com/Zend_Service_WindowsAzure
A propos de Zend Technologies
Zend Technologies Inc., la PHP Company, est le leader des produits et services de développement, déploiement et gestion d’applications Web PHP critiques. PHP est utilisé par plus de 20 millions de sites Internet et est rapidement devenu le langage le plus répandu pour développer des applications stratégiques. Mondialement déployée dans plus de 27 000 entreprises, la gamme de produits Zend apporte une solution complète durant tout le cycle de vie d’une application PHP. Le siège de Zend est situé à Cupertino en Californie.
Pour plus d’informations, visitez www.zend.fr ou appelez le 01 48 55 02 00.
# # #
Zend, Zend Technologies, Zend Framework, Zend.com, Zend Server, and associated logos and icons, are trademarks of Zend Technologies, Inc. and may be registered in certain jurisdictions. All other trademarks are the property of their respective owners.
Contact Presse :
Christophe Chervy
01-48-55-02-02
Christophe@zend.com
Proposé par Christophe Chervy
La version 1.9.3 PL1 de Zend Framework vient de sortir et est désormais disponible au téléchargement. Elle corrige une faille de compatibilité de versions trouvée dans la version 1.9.3 qui est sortie quelques heures avant. Attention, la version 1.9.3 PL1 doit être utilisée à la place de 1.9.3 !
La version 1.9.3 est la troisième de la série 1.9. Près d'une centaine de corrections ont été apportées sur 40 composants différents du Framework, notamment sur :
Vous pouvez télécharger Zend Framework 1.9.3 PL1 ici. Pour voir la liste complète de mises à jour, veuillez consulter le changelog. Plus de détails sur le site officiel de Zend.
L'OSDC (Open Source Developers Conference France) est un évènement communautaire, organisé le 2 et 3 octobre 2009 au Carrefour Numérique de la Cité des Sciences, à Paris (porte de la Villette).
L'objectif d'OSDC.fr est de rassembler les développeurs francophones de différentes communautés autour des technologies innovantes de la programmation...
J'ai été retenu avec comme sujet : "Les bases de données à portée de mains en PDO" avec le langage PHP.
Pour plus d'informations : http://www.osdc.fr
Les Peluches elePHPants sont très sollicitées et surtout très demandées.

La nouvelle vague de pelluche arrive et il sera possible d'en adopter pendant le forum PHP, ce qui va rassurer beaucoup de personnes... Alors patience...
Quelqu’un peut-il me venir en aide? J’ai ce message de temps en temps (après un appel à un webservice par exemple).
J’utilise wampserver 2.0 (apache 2.2.6 + php 5.2.5).
Voici ce que j’ai trouvé dans les logs d’apache :
[Fri Sep 25 10:33:54 2009] [notice] Parent: child process exited with status 3221225477 — Restarting.
[Fri Sep 25 10:33:55 2009] [notice] Apache/2.2.6 (Win32) PHP/5.2.5 configured — resuming normal operations
[Fri Sep 25 10:33:55 2009] [notice] Server built: Sep 5 2007 08:58:56
[Fri Sep 25 10:33:55 2009] [notice] Parent: Created child process 4296
[Fri Sep 25 10:33:55 2009] [notice] Child 4296: Child process is running
[Fri Sep 25 10:33:55 2009] [notice] Child 4296: Acquired the start mutex.
[Fri Sep 25 10:33:55 2009] [notice] Child 4296: Starting 250 worker threads.
[Fri Sep 25 10:33:55 2009] [notice] Child 4296: Starting thread to listen on port 8080.
Si ça dit quelque chose à quelqu’un, merci bien
!
PHP scan : mb_encode_mimeheader
Je travaille depuis très exactement 13 jours sur un projet Magento histoire de changer un peu d'eZ Publish. Bon, en réalité j'ai fait 2 jours de formation et 11 de développement plus une petite expérience d'optimisations côté système. C'est certes trop court pour en saisir toutes les subtilités techniques mais c'est largement suffisant pour y voir de très bonnes choses et de beaucoup moins bonnes.
Parmi les excellents points :
Dans les moins bons points :
OWF (Open World Forum) et OSDC (Open Source Developers conference) sont 2 évènements différents pour le début octobre :
Ces 2 évènements sont gratuits, il faut impérativement s'inscrire pour être sur d'avoir une place.
Comme tous les ans, l’AFUP réunira les 12 et 13 Novembre quelques grands experts internationaux du monde PHP, qui viendront échanger autour des problématiques phares du langage open source. L’occasion de faire le point sur les évolutions fonctionnelle et technique, communautaire et entreprise de PHP.
Cette 9ème édition sera axée sur le couple PHP/MySQL, avec 8 conférences dédiées. LEMUG.fr, l’association francophone des utilisateurs de MySQL et partenaire de l’événement animera 3 conférences.
Le Forum PHP accueillera en exclusivité et pour la première fois en France, Michael « Monty » Widenius, le créateur de MySQL. Suite au rachat de MySQL AB dont il était le co-fondateur, Monty a créé l’Open Database Alliance, un consortium et un lieu d’échanges pour tous les acteurs de l’écosystème de la base de données. Par ailleurs il fonde Monty Program ab, et poursuit le développement de MariaDB. A ce titre Monty présentera une conférence intitulée : « MariaDB the future of MySQL ».
Le PHP se décline au féminin avec la participation de : Zoe Slattery, PHP Women. Zoe a œuvré pour le compte d’IBM pendant 20 ans. En 2007, elle s’implique dans la promotion de PHP et développe des phases de tests. Anna Filina, PHP Québec, animera une conférence dédiée aux décideurs sur l’analyse des comportements des développeurs.
Reconnu mondialement comme une alternative de choix aux langages de programmation .Net ou J2EE, PHP est aujourd’hui une technologie mature qui entre dans une phase d’industrialisation. Largement adopté dans le monde de l’entreprise, PHP est un élément clé des infrastructures Web.
L’édition 2009 sera l’opportunité d’aborder l’industrialisation, la professionnalisation et la maturation du langage PHP avec une formule qui fait son succès chaque année : des conférences animées par les meilleurs experts internationaux des retours d’expérience issus des grands comptes des ateliers pratiques.
Comme tous les ans, je serais présent à cette événement sur le stand Anaska (sponsor Gold), n’hésitez donc pas à passer me faire un petit coucou.
Plus d’infos : AFUP.org
Comme tous les ans, l’AFUP réunira les 12 et 13 Novembre quelques grands experts internationaux du monde PHP, qui viendront échanger autour des problématiques phares du langage open source. L’occasion de faire le point sur les évolutions fonctionnelle et technique, communautaire et entreprise de PHP.
Cette 9ème édition sera axée sur le couple PHP/MySQL, avec 8 conférences dédiées. LEMUG.fr, l’association francophone des utilisateurs de MySQL et partenaire de l’événement animera 3 conférences.
Le Forum PHP accueillera en exclusivité et pour la première fois en France, Michael « Monty » Widenius, le créateur de MySQL. Suite au rachat de MySQL AB dont il était le co-fondateur, Monty a créé l’Open Database Alliance, un consortium et un lieu d’échanges pour tous les acteurs de l’écosystème de la base de données. Par ailleurs il fonde Monty Program ab, et poursuit le développement de MariaDB. A ce titre Monty présentera une conférence intitulée : « MariaDB the future of MySQL ».
Le PHP se décline au féminin avec la participation de : Zoe Slattery, PHP Women. Zoe a œuvré pour le compte d’IBM pendant 20 ans. En 2007, elle s’implique dans la promotion de PHP et développe des phases de tests. Anna Filina, PHP Québec, animera une conférence dédiée aux décideurs sur l’analyse des comportements des développeurs.
Reconnu mondialement comme une alternative de choix aux langages de programmation .Net ou J2EE, PHP est aujourd’hui une technologie mature qui entre dans une phase d’industrialisation. Largement adopté dans le monde de l’entreprise, PHP est un élément clé des infrastructures Web.
L’édition 2009 sera l’opportunité d’aborder l’industrialisation, la professionnalisation et la maturation du langage PHP avec une formule qui fait son succès chaque année : des conférences animées par les meilleurs experts internationaux des retours d’expérience issus des grands comptes des ateliers pratiques.
Comme tous les ans, je serais présent à cette événement sur le stand Anaska (sponsor Gold), n’hésitez donc pas à passer me faire un petit coucou.
Plus d’infos : AFUP.org