08
JUIN

Retour sur les 2 jours du Forum PHP 2012

Publié le 08/06/12 à 14h00 par lepalmier

Le forum PHP 2012 organisé par l'Afup était l'occasion d'assister à bon nombre de conférences plus intéressantes les unes que les autres.

undefined

Après une keynote d'ouverture à laquelle je n'ai malheureusement pas pu être présent (train+RER+métro), Rasmus Lerdorf a présenté les nouveautés de PHP 5.4.

En plus des optimisations du core du langage, qui le rendent plus performant, de nouveaux concepts ont été apportés.

 

PHP in 2012 (Rasmus Lerdorf)

Commençons par les Traits.

Leur but est d'apporter une réponse à l'impossibilité de faire de l'héritage multiple dans PHP. Les traits permettent de définir un comportement commun pour les classes, même si celles-ci ont des rôles complètement différents.

Conférence mené par Rasmus Lerdorf sur les nouveautés de PHP 5.4

Par exemple, plutôt que d'avoir une classe gérant l'accès à la base de données et une classe gérant les utilisateurs qui étendent la même classe de base, il est plus judicieux qu'elles partagent le même trait.

Ils s'utilisent avec le mot-clé use. L'appel d'un trait correspond finalement à un copier/coller du code directement dans la classe qui l'utilise.

 

IMC ou Instance Method Call

Cette fonctionnalité permet d'appeler directement une méthode de l'objet lors de son instanciation. Par exemple :

$obj = new(Foo)->setName('bar')->getName() ;

 

Closure dans les classe

Class foo()
{
	public function bar()
	{
		return function() { echo $this->name ; }
	}
}

Cela permet donc le support de $this dans les fonctions anonymes.

 

Callable Typehint

Un objet de type "callable" peut être utiliser comme une fonction, et donc être appelé :

public function foo(Callable $do)
{
    $do() ;
}

Un webserveur intégré à PHP

PHP 5.4 dispose d'un webserver intégré, et permet donc de tester ses applications sans avoir à installer apache.

 

JSON

Json est mieux supporté et une classe peut hériter de jsonserializable, qui implémente :

jsonserialize()

Cette fonction permet de sérialiser l'objet au format json.

$foo->jsonserialize() ;

Avenir


Le développement de PHP6 a été précipité, notamment au niveau du support de l'UTF-8. Donc il a été décidé de poursuivre le développement plus lentement, pas-à-pas.

 

 

Annoting with Annotations (Rafael Dohms)

J'ai ensuite assisté à une conférence sur les annotations. Voici ce que j'en ai retenu :

Support

Les annotations ne sont pas supportées nativement dans PHP, et ne le seront probablement pas.

D'après Rasmus, l'apprentissage d'un nouveau langage par-dessus PHP est inutile.

Une RFC pour implémenter les annotations dans le core de PHP a été rejetée en 2010.

Pour Contre
Permet de contextualiser le comportement/la configuration dans l'objet Pas simple à débuguer, il faut débuguer la classe de Parsing
Les annotations sont dans un docblock, donc elles sont parsées Performance non optimale, car non-native

Les moteurs

Il existe plusieurs moteurs d'annotations.

  • Le plus complet est celui de Doctrine, Doctrine Commons
  • Mais le moteur de Zend, ZF2 annotation est aussi un bon moteur

Personnalisation

Il est possible de créer ses propres annotations, pour créer des filtres par exemple. On la déclare comme ceci :

namespace Filter

/**
* @annotation
*/
class myFilter()
{
    public function NoAccent($string)
    {
        //test si la chaîne contient des accents ou non
        //et effectue le retour approprié
    }
}

On l'utilise ensuite comme suit :

/**

* @FilterNoAccent

*/
private $name ;

Pendant ce temps-là se déroulait une conférence sur comment tirer parti de Postgresql en PHP avec Pomm (slide à cette adresse).

 

Coup de pied dans la LAMP (Benjamin Clay & Damien Alexandre)

Après quoi, Benjamin Clay et Damien Alexandre ont animé "Coup de pied dans la LAMP".

Coup de pied dans la LAMP (Benjamin Clay & Damien Alexandre)

C'était une session très intéressante sur l'état actuel de la traditionnelle stack LAMP et les alternatives que l'ont peut trouver. Tout le monde sait qu'un site trop lent, ou qui affiche des erreurs est pénalisé. Les accès concurrentiels sont donc très importants. Pour remédier à cela, il existe des solutions simples, et qui améliore instantanément les performances du serveur. Il suffit par exemple d'utiliser du cache d'OPCode. On l'installe simplement avec la commande :

apt-get install php5-apc

On peut alors atteindre les 70 requêtes/seconde. Il existe un repository qui permet de rendre plus performant un serveur LAMP : DotDeb Mais on peut aussi améliorer les performances d'un serveur en jouant sur d'autres leviers.

MySQL

Il n'existe pas de config parfaite de MySQL. Mais pour trouver la plus adaptée, il existe des outils :

  • MySQLTuner.pl
  • MySQL Tuning Primer

Il faut changer des paramètres dans la configuration de MySQL pour arriver au meilleur résultat. On peut par exemple jouer sur le paramètre : innodb_buffer_pool_size. Il est très important. (Parfois, 80 % de la ram est allouée à ce paramètre sur les serveurs dédiés à MySQL).

Il est aussi possible d'attribuer cette valeur, elle est adaptée dans la majorités des cas.

innodb_flush_method = O_DIRECT

Apache2

Pour améliorer les performances d'Apache2, il suffit d'installer mod_status en utilisant la commande :

a2enmod mod_status

Alternative à LAMP

Il existe des alternatives à la traditionnelle stack LAMP. Pour remplacer MySQL, on peut par exemple utiliser MariaDB. C'est un fork de MySQL. C'est complètement opensource, 100 % compatible avec MySQL, et utilise les mêmes drivers. Des sociétés fournissent du support pour MariaDB. Il est simple a installer en apt-get en ajoutant les sources dans le repository list. MariaDB gère l'XtraDB. C'est une amélioration d'InnoDB. Ce SGBD supporte le threadpool.

C'est très important quand le serveur est soumis à un nombre d'accès concurrentiels élevé, car il permet d'augmenter le nombre de transactions/seconde. On peut alors utiliser sysbench pour tester la base de données.

NGINX

NGINX est un server web créé en 2002. C'est le 3ème serveur web après Apache2 et IIS. Utilisé avec PHP-FPM il supporte le PHP. Il est installable très simplement :

apt-get install nginx php5-fpm

Le couple MariaDB/NGINX est plus de 3 fois plus rapide que Apache2.2/MySQL.

Cherokee

Cherokee est aussi un server web « alternatif ». La configuration pour les différents langages est simple. Sa particularité est justement de pouvoir être administré via une interface web. Il n'est pas aussi bien que NGINX mais mieux que Apache2.2.

PHP 5.4

Pour améliorer les performances d'un serveur, il suffit de le passer en PHP 5.4 si ce n'est pas déjà fait. C'est facile a faire avec DotDeb (très peu d'incompatibilité, mais le cache d'OPCode APC est encore en bêta). Comme dirait les conférenciers, c'est du free win pour des performances accrues !

Apache 2.4 est sorti

Malheureusement il ne dispose pas d'installaton simple, il faut le compiler. Il est plus performant que la version 2.2, et s'approche du niveau de NGINX.

HTTP

Le protocole en version 1.1 est très vieux : 1997 !

Spdy

Il est candidat pour HTTP 2.0 Une seule connexion est requise pour toutes les ressources d'une page web ! Il est utilisé par Google, Twitter et Wikipedia. L'installation est simple : On récupère le .deb

dpkg -i mod-spdy-*.deb

Et on peut obtenir des performances super accrues ! (temps de charge de la page divisé par 2 dans l'exemple).

 

Frédéric Hardy et Ivan Enderlin présentait pendant ce temps-là "Anatomie du test". Le slide est dispo à cette adresse.

Et pendant que Damien Seguy expliquait que "Ses développeurs parlent chinois !" (slides ici), j'ai écouté Kenny DITS parlé du Monitoring applicatif.

 

Monitoring Applicatif (Kenny DITS)

Kenny DITS explique pourquoi il est important de monitorer ses applications

Pourquoi faut-il monitorer ses applications ?

  • Savoir quand un service php ne fonctionnent plus
  • Vérifier que les erreurs et temps de chargement n'empirent pas
  • Mesurer l'impact d'une pub sur le site
  • Trouver la rootCause lors d'un incident
  • Au final pour retrouver de la vue sur les projets.

Que doit-on monitorer ?

Tout ! Il existe évidemment des logiciels pour nous aider à monitorer. Deux logiciels sont utilisés chez M6 Web : Graphite et StatsD. Ils fonctionnent en couple.

StatsD

Il est en node JS sur protocole UDP. L'avantage d'UDP est qu'il n'y a pas d'attente de réponse et donc pas d'impact si le serveur ne répond pas. Il ne faut cependant pas utiliser trop d'UDP, qui risquerait de faire tomber le serveur (pile saturée). Au pire, on peut utiliser du load balancing sur serveur node.js.

Graphite

Il stocke les métriques dans le temps et permet de grapher ces métriques à la demande. Il est relativement complexe à utiliser, mais puissant. On peut paramétrer la rétention des données (1 minute chez M6 web).

Le dashboard

Graphite propose son propre dashboard. Il est possible de créer plusieurs dashboard (un pour la BDD, un autre pour le SEO...).

Alerting

Graphite ne fait pas d'alerting, mais permet de le faire. Graphite renvoie un JSON, qu'il est possible d'utiliser. Graphite est très bien, mais ne remplace pas les outils de log habituels. Il ne fait pas de détail, mais de la volumétrie.

Vous pourrez retrouver cette conférence lors du Web Event Lyon la semaine prochaine.

 

 

À 14h, Julien PAULI nous faisait découvrir PHP de l'intérieur, et nous expliquant (brièvement) le code qui était généré derrière. Sa présentation est consultable ici. En parallèle, une conférence sur la haute disponibilité au service du public se tenait dans l'autre salle.

Juste après se tenaient deux conférences. L'une sur les chiffres du monitoring et ce qu'ils représentent (slider ici) et l'autre sur la gestion des dépendances dans un projet PHP (slider ici).

 

 

FlashTalks

La session de flashtalks était intéressante et présentait des projets qui méritent d'être (plus) connus.

HipHop for PHP

Transforme l'application PHP en C++ ou HHBC. Les constantes, stubs, includes, applications sont transformés en un binaire sur le serveur. HipHop vs LAMP  = -70 % de consommation CPU. C'est un gain énorme de performance ! Cependant, il présente des limites :

  • Pénible à compiler
  • Limiter à PHP 5.3
  • Pas mal d'extensions ne fonctionnent pas avec HipHop

Refonte agile d'existant en PHP

Il ne faut pas essayer de refondre tout le système en une seule fois. La refonte agile de la couche métier doit être effectuée brique par brique. Il faut créer des API si jamais vous avez besoin d'appeler l'existant.

Organisation personnelle

Ne faites pas confiance à votre mémoire ! Le cerveau a beaucoup de mal à mémoriser plusieurs informations de même importance quand elles arrivent dans un court laps de temps. Il faut définir ses priorités. GTD : Il faut identifier les tâches et être orienté vers l'action.

Information entrante : action nécessaire ? Oui/Non     Si oui : tâche unique ou plusieurs tâche ?         Si tâche unique             si moins de 2 minutes le faire tout de suite            sinon le planifier

Il faut se servir de la matrice d'Eisenhower pour savoir comment doit être traité une tâche.

 Matrice d'Eisenhower qui montre comment prioriser les tâches

Mouf

C'est un framework open source permettant de télécharger, utiliser et réutiliser des composants PHP de manière graphique. C'est un framework d'injection de dépendances. APM = Alternative PHP Monitor, est une extension PHP très utile pour le débugage. Elle permet de récupérer une stack-trace des erreurs. Elle dispose d'une interface graphique et elle est compatible avec certains IDE.

 

Durant la session de flashtalks avait lieu une présentation appelée "Modélisation des menaces d'une application web : étude de cas". Après quoi, Gerald CROES nous expliquait pourquoi Phing est devenu son meilleur ami. Pendant que Serge Frezefond expliquait les fonctions avancés du driver MySQL natif pour PHP.

Qu'est-ce que Phing ?

C'est un outil de build (dans le sens construction, pas compilation) Phing est un portage de Ant pour PHP

  • Facile à installer
  • Ecrit en PHP
  • Nombreuses tâches natives
  • Qui intègre les outils spécifiques à PHP
  • Facile à étendre
Lexique
  • Action : spécifique et unitaire (copie de fichier, lancement de tests...)
  • Cible : ensemble de tâches

Ce qu'on peut faire avec Phing

  • Télécharger des librairies tierces
  • Automatisation du download de fichier (Utile pour jquery par exemple)
  •  Fonctionne pour les projets GIT aussi si l'on veut

Possibilité d'utiliser directement des commandes bash. Il est possible d'appeler des opération phing dans une opération phing. Exemple : download all lance

  • download jquery
  • download fancybox

Possibilité de tester dans l'action phing : Si la librairie existe, ne pas télécharger, sinon lancer le download. Génération de documentation En utilisant phpDocumentor par exemple On choisi un ensemble de fichiers

<fileset dir='./sources/' includes ='**/*.php' exludes='**/test_*.php'>

On peut aussi faire la même chose en sous nœuds

<fileset dir=''>
	<include name=''>
	…

* = une partie du nom ** = une partie du chemin Il existe même une balise qui permet d'appeler PHPDocumentor.

 

Deuxième jour au forum PHP 2012

Le lendemain, Mercredi 06 Juin 2012, la première conférence à laquelle j'ai assisté n'était pas technique, mais n'en était pas moins intéressante pour autant. Elle avait pour thème l'open source.

L'open source peut être utilisé comme CV, permet donc de se faire reconnaitre dans le monde du web. Faire de l'open source crée des retours, que ce soit des conseils, des corrections ou même simplement des remerciements.

Slide d'ouverture de la conférence sur l'open source au forum PHP 2012

Pourquoi les entreprises devraient utiliser et contribuer à l'open source ?

Pour ne pas réinventer la roue déjà. Et puis cela permet d'avoir plus de monde qui travaillent sur la correction du code. Sans parler de la publicité que ça apporte à l'entreprise. Les clients viennent directement, sans avoir à prospecter. Ils savent que l'entreprise dispose de compétences dans le langage/domaine. De plus, partager son code n'engendre pas de coût supplémentaire. Il n'y a pas de garantie à fournir, pas de support, ça n’exclut pas les bugs, les incompatibilités... Cependant il est toujours apprécié de répondre aux demandes de support ou bug fix, mais ce n'est pas obligatoire. Dans le cas où vous ne souhaitez/pouvez pas répondre à une requête, il faut au moins prendre le temps de répondre par la négative et rediriger la personne vers des pistes de solution. Il est aussi préférable d'indiquer que le plugin/projet est déprécié quand c'est le cas.

Pourquoi partager ce qu'on a mis du temps et argent à développer ?

Simplement parce que cela peut ouvrir de nouvelles perspectives et de nouveaux marchés.

Exemple :

  • Sensio qui est passé de simple web agency à une entreprise mondiale très bien implémenté sur le marché.
  • La BBC fait des softwares, ils ont besoin de logiciels pour broadcaster. Ils ont décidé d'open sourcé leur software et maintenant la communauté a développé beaucoup de plugins.

En revanche, il faut éviter de prendre de l'open source pour en faire un logiciel fermé. Exemple :

  • Amazon kindle fire. Ils ont pris android et l'ont changé pour leurs besoins mais maintenant il est fermé et doivent le maintenir par eux-mêmes.

Souvent les entreprises se disent : "c'est trop de boulot" ou "on donne notre savoir/compétences" Mais est-ce que tout le code fait partie du coeur du business ? Est-ce qu'il n'y pas des choses que l'on pourrait donner ?

Il n'y a pas que l'open source, mais aussi l'open data.

Exemple :

  • Foursquare : ils ont ouvert leurs données, et il est possible d'en faire ce que l'on veut avec leur APIs, même en faire de l'argent avec son propre service.
  • Open street map est bien plus ouvert et permet plus de customisation que Google Maps. Il commence donc à être plus utilisé.

Faire un projet open source

Avant de lancer un projet, il faut voir s'il y a de la demande, résoudre un problème pertinent. Il peut y avoir des défauts dans le code, ce n'est pas un problème, la communauté les règlera si elle trouve le projet intéressant. Comment contribuer ?

  • En souscrivant à la mailing list d'un projet
  • En posant des questions
  • En participant sur un channel IRC
  • Ne pas hésiter à répondre aux questions si on connaît la réponse.
  • Commencer un blog ou commenter sur un blog

 

Je n'ai pas assité à la conférence "dev et admin sys : une cohabitation simplifiée", mais j'ai plutôt été assisté à "Maîtrisez les structures de données 102". C'était très intéressant, mais assez difficile à restranscrire dans un billet comme celui-ci. Je vous laisse donc le plaisir d'aller consulter le slider mis à votre disposition.

 

Parallèlement à la conférence sur Drupal, Jean-Marc Fontaine animait "la qualité au-delà du code" (slider ici).

Drupal comme vous ne l'avez jamais vu

Drupal comme vous ne l'avez jamais vu

Une conférence était dédié à l'optimisation sous Drupal comme son nom l'indique. Ce CMS qu'on ne présente plus et qui offre des possibilités gigantesques. Le slider se trouve à cette adresse, vous y trouverez beaucoup d'informations intéressantes. Pendant le petit cours de Zend Framework, Damien Seguy expliquait comment automatiser la qualité, et a notamment parlé de deux outils :

  • Fuzzing : tests automatiques des formulaires
  • Jmeter : tester un scénario de navigation

Ensuite, deux conférences ont eu lieu. L'une nommée "Scaling Communication through Continuous Integration", et l'autre "Démons en PHP, de inetd à ZeroMQ".

Cette dernière expliquait ce qu'était un démon, à quoi ils servent et comment les créer. Les slides se trouve à cette adresse.

Alors qu'Emile Heitor présentait une "Scalabilité sans limite pour vos applications PHP grâce au Zend Cloud", j'assistais à la conférence de Jérôme VIEILLEDENT.

 

Accès concurrents et scalabilité (Jérôme Vieilledent)

PHP est synchrone, chaque processus est isolé. HTTP est (à peu près) stateless et PHP respecte ce principe Mais... Les visiteurs ne sont pas synchrones, et les contributeurs non plus, donc il faut anticiper la charge. Tant qu'on est dans le flux PHP, il n'y pas de soucis.Mais ça se complique quand on interagit avec le monde extérieur. Le cache, très utilisé pour amélioré les perfomances d'une web app, est généralement écrit sur un disque. Idem pour les fichiers publiés par les contributeurs.

Accès concurrent : cas classique

Si pendant la génération du cache, d'autres requêtes similaires arrivent, que peut-il se passer ?

  • lock wait timeout = cache vide
  • deadlocks = page qui chargent indéfiniment
  • Écritures concurrentes = cache corrompu
Quelles sont les solutions immédiates ?
  • pré-générer le cache : mais que sert-on pendant la génération ?
  • CDN : ça coûte cher
  • Reverse-proxy (Varnish) : site plus statique (à première vue)

Mais il y a mieux : Stale Cache

Stale veut dire expiré en anglais. Comment ça marche ? On n'écrase pas le cache expiré, et on le sert pendant la génération du nouveau cache.

Scalabilité

On recherche souvent la scalabilité horizontale (on ajoute des serveurs). Mais pour la synchronisation, quels outils utiliser ?

  • NFS
  •     il n'est pas très ami avec PHP
  •     il n'est pas fiable sur les metadata
  • SAN
  •     coûte cher
  • Rsync
  •     c'est lent
  •     la synchronisation est indépendante de l'application (pas de contrôle)
  •     on part du principe que les ressources sont toujours disponibles
  • DRBD = distributed replication block device
  •     même inconvénients que Rsync, mais il est plus rapide
  •     ça peut avoir du sens pour de la réplication de fichiers de configuration

PHP Cluster

C'est une librairie PHP « cluster aware » qui se substitue aux fonctions PHP natives. On peut donc essayer de concilier les deux : On utilise Varnish (ou autre CDN) pour les médias qui soulageront beaucoup le serveur et on utilise l'API cluster pour purger/remplir le cache HTTP.

Pour finir, une table ronde DSI était organisée pendant qu'Atoum nous a été présenté par son créateur Frédéric Hardy comme une alternative simple à PHPUnit. Voici le principe du TDD (Test Driven Develoment)

Atoum

  1. On écrit le test
  2. On lance
  3. Ça plante (puisque le code n'existe pas)
  4. On écrit le code
  5. On re-teste

On appelle ça des tests unitaires, car on teste une unité du programme. Il y a cependant un problème avec Atoum : il n'y a pas de documentation. Mais le but c'est qu'il n'y en ai pas besoin ! Atoum est écrit en PHP 5.3 : fonctions anonymes, namespaces...

Il est censé être intuitif. La philosophie du framework est qu'on n'ai pas à se poser de questions pour écrire les tests. Simplicité, Modernité, Intuitivité sont les trois mots-clés qui le décrivent.

Installation
  • Sur Github, il y a la version de dev. Mais il fonctionne à 99 % du temps
  • En utilisant le phar. Possibilité de mettre à jour directement via le phar, avec possibilité de rollbacker. En contrepartie, il y a une petite perte de performance.
  • En utilisant Composer

Atoum utilise un langage naturel pour l'écriture des tests, mais peut aussi être utilisé avec une syntaxe plus classique. La démo réaliser en live a été plutôt convaincante.

Conclusion

Ces deux journées de conférences ont été riches en informations. L'univers PHP évolue et apporte son lot de nouveautés pour nous faciliter la vie. Avec des performances accrues et des outils de plus en plus pointus, notre langage préféré n'a pas fini de nous surprendre, dans le bon sens ;)

Baraguiné par amaury le 11/06/12 à 22h09
amaury sur La Ferme du Web
Pour information, une majorité des présentations est disponible :
http://joind.in/event/view/947

La conférence de Rasmus est dispo : http://talks.php.net/show/afup12

Ajouter un Commentaire

Pour poster un commentaire, vous devez être identifié. Vous pouvez choisir parmi ces trois méthodes d'identification:

Compte la Ferme du Web

Identifiez-vous
Inscrivez-vous

Compte Facebook

Connexion avec Facebook

Compte Twitter

Connexion avec votre compte twitter
Rechercher sur la Ferme du web