::franek::

Aller au contenu | Aller au menu | Aller à la recherche

Mot-clé : php

Retour sur le #phptour de Lille

J'ai participé au #phptour, un nouvel événement itinérant autour de la technologie PHP proposé par l'AFUP. Cette année, cet événement avait lieu à Lille. Pour l'année prochaine, on évoque Nantes, Lyon ou Bordeaux. Le Forum PHP est quant à lui décalé et aura désormais lieu en juin.

Voici quelques notes prises concernant les conférences auxquelles j'ai assistées.

Présentation de PHP5.4 par Julien Pauli (en remplacement de David Soria Parra qui ne pouvait être présent)

Julien a fait un rapide état des lieux autour de la future version de PHP :

  • Le mode de contribution avec PHP5.4 évolue. Il est désormais obligatoire de passer par une RFC.
  • Le mode de publication évolue également à partir de la version 5.4 en se rapprochant d'un système de publication à la Ubuntu. Une version mineure sera publiée chaque année. Chaque version aura une durée de vie de 3 ans. Seules les versions majeures pourront casser la compatibilité. Le nouveau mode de publication est détaillée sur le wiki de php.
  • Le dépôt des sources de PHP va migrer de subversion à git (a priori, à Noël). Les sources seront disponibles sur les serveurs de PHP.net (mais également sur github, miroir).
  • Le principale apport de PHP5.4 est sa performance. PHP5.4 sera environ 50% plus rapide (d'après les quelques benchs réalisés, tout dépend de votre application)
  • PHP5.4 supprime des vieilleries (notamment, register_globals, magic_quotes, session_register(),...)
  • E_ALL contiendra désormais E_STRICT.
  • La syntaxe <?= n'est plus dépendante de la configuration short_open_tags.
  • PHP5.4 propose un serveur web embarqué afin de simplifier le développement mais qui ne doit pas être utilisé en production !!
  • PHP5.4 propose ensuite des nouvelles fonctionnalités au niveau du langage :

Les slides de la conférences sont disponibles sur slideshare.

Industrialisation PHP chez lamaisondevalerie par Sophie Beaupuis

Sophie travaille historiquement chez lamaisondevalerie.fr. Lamaisondevalerie a été racheté par Conforama afin de développer l'offre e-commerce de conforama. Sophie nous a présenté les méthodes et outils mis en oeuvre pour la réécriture de la solution e-commerce de Conforama :

  • choix d'une solution basée sur le Zend Framework en remplacement de Websphere e-commerce
  • recrutement d'une équipe de développement (non sans difficultés apparemment)
  • passage à une méthodologie agile. Elle essaye de se rapprocher de plus en plus de la méthodologie Scrum.
  • chaque matin, réunion de 20 minutes pour faire un bilan sur les dev réalisés la veille et sur la planification des dev de la journée.
  • mise en place de bonnes pratiques :
    • mise en place de convention de codage
    • mise en place de tests unitaires
  • Passage à git, comme gestion des sources. Le passage à git a nécessité de créer des rôles de Source Manager. 2 personnes sont responsables des fusions des branches chaque soir.
  • mise en place d'une plate-forme d'intégration continue (PHPUnderControl, pour le moment)

Suggestion dans la salle :

Les slides sont disponible sur le site de l'AFUP.


Retour d'expérience sur XHProf par Martin Supiot

Martin nous a présenté son retour d'expérience sur XHProf un outil de profilage de PHP développé par Facebook qui mériterait d'être plus connu. Cet outil n'est pas très gourmand et peut-être installé en production. Il est possible de configurer XHProf afin qu'il exécute le profilage par échantillonnage (une requête sur 10000, par exemple).

En attendant les slides, je vous renvoie sur un article que j'avais écrit qui reprend une partie des slides de Martin.

Dommage que Martin n'ait pas parlé des alternatives au profilage en production (pas en dev), notamment, Newrelic (solution dans le cloud) qui est vraiment intéressante mais un peu chère.

Edit : Les slides sont disponibles sur le blog de Martin.


Services asynchrones & multilangages avec Mongrel2 et ZeroMQ par Loïc d'Anterroches

(A venir)


phpcloud.com : Be a PHP Hero! par Zeev Suraski

Zeev nous a présenté la nouvelle offre de Zend PHPCloud qui permet de déployer facilement une application dans un cloud proposé par Zend. La solution est encore en beta. PHPCloud intègre toutes les fonctionnalités de Zend Server (profilage, cache d'opcode, évènements, ...).


Les CMS basés sur framework en environnement profressionnel par Mathias Desloges et Raphaël Theet

Mathias et Raphaël travaillent chez Octave&Octave. Ils nous ont présenté leur solution de CMF (Content Management Framework), Centurion. Centurion est basé sur le Zend Framework (version 1.X, il n'est pas prévu de migrer en 2.X pour le moment). Centurion propose un ensemble de mécanisme permettant de simplifier le développement d'un site e-commerce.


Atoum, framework de tests unitaires pour PHP5.3+ par Frédéric Hardy

Frédéric Hardy nous a présenté son nouveau framework de tests unitaires. Excellente présentation qui donne envie de le tester. Atoum est désormais un excellent challenger à PHPUnit. La concurrence a, en général, du bon.


Drupal et Varnish, une histoire qui marche par Nicolas Silberman

Nicolas nous a fait un retour d'expérience sur l'intégration de Varnish en frontal de Drupal. Il a largement utilisé les VCL ainsi que les ESI (Edge Side Includes). Les ESI permettent de mettre en cache un bloc de page et sont interprétées par Varnish. Depuis la version 2 de Symfony, il est possible de les intégrer facilement dans un développement à base de Symfony.


Etes-vous prêts pour le succès par Steven Van Poeck

Steven nous a présenté une méthodologie pour faire évoluer une architecture en fonction du nombre de visiteurs. Je n'ai pas toujours été d'accord avec ses choix (notamment, sur la désactivation des logs Acces_log sur les frontaux) mais globalement, assez d'accord.

Les slides de sa présentation sont disponibles sur Slideshare.


Suivi qualité avec Sonar pour PHP par Gabriele Santini

Gabriel nous a présenté Sonar pour PHP. Sonar ne doit pas être comparée à une PIC (Plate-forme d'Intégration Continue) comme Jenkins. Sonar est un logiciel libre permettant de mesurer la qualité du code source des projets de développement. Depuis peu, Sonar propose un plugin pour PHP. Il vient en complément de Jenkins. Pour Gabriele, les conventions de codage (via PHP_Code_Sniffer), la complexité du code (via PHPMD), ... ne doivent pas être vérifiées dans la PIC mais dans Sonar. Il existe un plugin permettant d'intégrer Sonar dans Jenkins.


Améliorez votre productivité avec Symfony2 par Hugo Hamon

Rapide présentation de Hugo sur les nouvelles fonctionnalités de Symfony2. Je ne suis personnellement pas fan des annotations mais c'est avis totalement personnel. Cette présentation donne envie d'aller plus loin. Le système de génération de l'admin, l'héritage dans Twig ou la gestion des caches (Reverse Proxy) semblent vraiment bien intégrées.


Sécurité des applications PHP par Marion Agé et Sébastien Baudru

Rien de neuf dans cette présentation sur la sécurité mais la mise en scène était excellente.


Zend Framework2 : State of the art par Enrico Zimuel

Enrico nous a présenté les nouvelles fonctionnalités de ZF2.

Sortie prévue de ZF2 : pas avant avril 2012 si j'ai bien noté.


Dev et admin sys : une cohabitation simplifiée par Nicolas Silberman et Sébastien Lucas

J'ai loupé le début de la conférence. Nicolas et Sébastien ont plutôt présenté la culture devops qui visent à rapprocher les équipes de dev avec les admin sys. J'ai bien aimé le tableau de présentation des outils à partager entre les équipes de dev et les équipes d'admin.


Magento - intégration continue, tests et automatisation par Alexande Salomé

Enfin, pour terminer, une bonne conférence sur la mise en place de l'intégration continue sur un projet. Alexandre a pris comme exemple Magento mais ça méthode pourrait s'appliquer à n'importe quel projet.

Les slides de sa conférence sur SpeackerDeck.

Jenkins : Respect des conventions de codage Javascript avec JSLint

Imaginons que vous disposez d'une plate-forme d'intégration continue (idéalement Jenkins ou Hudson) pour vos projets PHP (si ce n'est pas le cas, je vous invite à lire les excellents billets de Pascal Martin : Intégration continue avec Jenkins : installation et configuration de base et Intégration continue d'un projet PHP avec Jenkins).

Imaginons que vous n'utilisez pas Ant comme outil d'automatisation (de build) mais plutôt Phing parce que vous maîtrisez cet outil.

Imaginons que vous souhaitez également vérifier la qualité de vos développement Javascript (Dans un projet PHP, vous avez sûrement un peu de Javascript, non ?) et que vous souhaitez disposer d'indicateur de suivi de la qualité dans Jenkins.

Il existe plusieurs outils pour vérifier la qualité de son code Javascript :

L'outil JSL n'a pas évolué depuis 2007. Il nécessite d'être installé en suivant l'une de ces procédures. Avantage, il existe une tâche Phing pour exécuter JSL. Inconvénient, il n'est pas possible de générer un fichier XML compréhensible par Jenkins.

Je n'ai pas regardé Google Closure Linter.

JSHint semble intéressant. Mais à nouveau, il ne semble pas y avoir de mécanisme simple permettant de l'intégrer à Jenkins.

Jslint ne permet pas, a priori, nativement de générer un fichier XML compréhensible par Jenkins.

Je me suis donc tourné vers jslint4java. Je me suis inspiré du travail de Stephen Rees (qui utilise Ant) pour implémenter l'exécution de Jslint avec phing.

Voici le résultat :

    <!-- Fichier temporaire contenant la liste des fichiers JS à traiter avec JSLint -->
    <property name="temp_file_all_js" value="/tmp/${phing.project.name}/all_js.txt" override="true" />     

    <!-- Chemin vers Jslint4java -->
    <property name="jslint4java" value="/chemin/vers/jslint4java/jslint4java-2.0.0.jar" override="true" />     

    <!-- création d'un patternset contenant l'ensemble des fichiers JS à analyser -->
    <!-- on exclut les fichiers JQuery et les fichiers minimifiés -->
    <patternset id="js_files">
        <include name="public/js/**/*.js"/>
        <exclude name="public/js/**/*-min.js"/>
        <exclude name="public/js/jquery*.js"/>
    </patternset>

   <!-- ============================================  -->
    <!--   (jslint) Target: vérification syntaxe JS    -->
    <!-- attention à créer au préalable un patternset  -->
    <!-- ayant pour nom js_files                        -->
    <!-- ============================================  -->
    <target name="jslint">
        
        <!-- créer le repertoire de stockage du fichier temporaire -->
        <!-- s'il n'existe pas                                     -->
        <php function="dirname" returnProperty="temp_dir">
            <param value="${temp_file_all_js}"/>
        </php>
        <mkdir dir="${temp_dir}" />
        
        <!-- crée un fichier temporaire contenant la liste des fichiers JS à traiter -->
        <!-- cette liste se base sur le patternset refid=js_files -->
        <foreach param="filename" absparam="absfilename" target="_createFilesetText">
            <fileset dir="${install_dir}">
                <patternset refid="js_files" />
            </fileset>
        </foreach>
    
        <!-- on charge le contenu de temp_file_all_js dans la variable ${all_js} -->
        <loadfile property="all_js" file="${temp_file_all_js}"/>
        <echo>Fichiers analysés par JSLint : ${all_js}</echo>
        
        <!-- exécution de jslint4java                       -->
        <!-- browser permet de définir les variables du navigateur dans le contexte d'exécution -->
        <!-- prefed permet de définir les variables dans le contexte d'exécution -->
        <!-- voir : http://code.google.com/p/jslint4java/source/browse/jslint4java-docs/src/main/resources/cli.html -->
        <exec 
            command="java -jar ${jslint4java}
                     --browser --predef $,document,jQuery
                     --report xml
                     ${all_js} > ${builddir}/logs/jslint.xml" 
            passthru="true" 
        />
        
        <delete file="${temp_file_all_js}" />
    </target>

   <!-- ============================================  -->
    <!--   _createFilesetText Target:                  -->
    <!-- stocke la liste des fichiers JS à traiter     -->
    <!-- dans le fichier /tmp/all_js.txt               -->
    <!-- ============================================  -->
    <target name="_createFilesetText" >
        <echo file="${temp_file_all_js}" append="true">${absfilename} </echo>
    </target>

Vous devez ensuite appeler cette tâche dans votre tâche principale de build. Quelque chose comme ça :

<target name="build">
        <echo msg="tâche build" />
        <phingcall target="php-doc" />
        <phingcall target="pdepend"/>
        <phingcall target="phpmd"/>
        <phingcall target="phpcpd"/>
        <phingcall target="phploc"/>
        <phingcall target="php-cs" />
	<phingcall target="php-cb" />
	<phingcall target="phpunit" />
       <!-- on lance la vérification syntaxique de JS -->
        <phingcall target="jslint" />
 </target>

Vous pourrez ensuite configurer dans Jenkins l'appel du fichier de log (build/log/jslint.xml) : Jenkins - Configuration JSlint

Après l'exécution du build, vous devriez avoir dans le menu Violations, quelque chose comme ça : jenkins - violation JSLint

Installer xhprof et xhprof gui sur Zend Server

Xhprof est un profiler de code PHP. C'est un concurrent de Xdebug développé par Facebook.

Il a le gros avantage de permettre de visualiser l'évolution de la mémoire. A ma connaissance, Xdebug ne le permet pas.

Il ne nécessite pas l'utilisation d'un logiciel tiers (type KCachegrind, non disponible sous Windows...argh...) et peut être installé sur un serveur de production sans, normalement, trop dégrader les performances.

Je vais ici vous décrire son installation sur Zend Server CE et l'installation de xhprof gui

Si vous utilisez une installation de PHP moins exotique (genre une debian avec les dotdeb), son installation sera, à mon avis, simplifiée :

apt-get install php5-xhprof


Installation de xhprof

On récupère les sources et on les décompresse :

$ wget http://pecl.php.net/get/xhprof-0.9.2.tgz
$ tar xvfz xhprof-0.9.2.tgz

On compile :

$ cd xhprof-0.9.2/extension
$ /usr/local/zend/bin/phpize
$ ./configure --with-php-config=/usr/local/zend/bin/php-config
$ make
$ make test
$ sudo make install

On modifie la configuration de PHP pour lui indiquer de charger cette extension :

$ sudo vi /usr/local/zend/etc/php.ini

On ajoute :

[xhprof]
extension=xhprof.so
;
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
;
xhprof.output_dir=/tmp/xhprof

Il est nécessaire de créer le répertoire /tmp/xhprof et de donner les droits à l'utilisateur Apache (je fais un 777 par simplicité)

$ mkdir -p /tmp/xhprof
$ chmod 777 /tmp/xhprof

On redémarre Apache :

$ sudo /etc/init.d/zend-server restart-apache

Un phpinfo() doit normalement afficher l'extension xhprof.

On va tester rapidement que cela fonctionne en essayant de profiler un script PHP. Pour profiler il est nécessaire d'ajouter quelques lignes de code dans le script PHP. Vous verrez ensuite une technique pour l'ajouter de manière automatique sur l'ensemble des scripts PHP (via xhprof gui) :

<?php
...
xhprof_enable();

/**
 * your application code
 * ......
 * ......
 */

$xhprof_data = xhprof_disable();
$xhprof_root = '/chemin/vers/le/repertoire/xhprof-0.9.2/';
include_once $xhprof_root . "xhprof_lib/utils/xhprof_lib.php";
include_once $xhprof_root . "xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xr");

L'exécution de ce script devrait générer un fichier dans le répertoire /tmp/xhprof. Si oui, l'installation de l'extension xhprof est ok.

Visualiser l'analyse de vos scripts

xhprof propose une interface de consultation des "profiling" effectués. Cette application (xhprof gui) est disponible dans un dépôt git.

Xhprof gui

Actuellement, elle possède quelques dysfonctionnements (plantage lors de l'analyse d'un script trop important) mais qui peuvent être résolus.

Pour installer xhprof gui, vous pouvez suivre la procédure d'installation :

git clone https://github.com/preinheimer/xhprof.git
cd xhprof
ln -s xhprof_lib/utils/xhprof_runs_mysql.php xhprof_runs.php
mv xhprof_lib/config.sample.php xhprof_lib/config.php

Xhprof gui propose de stocker les éléments d'analyse dans une base (mysql, mssql, ...). Dans notre exemple, nous allons utiliser mysql.

On crée une base pour xhprof :

$ mysql -uroot -p
mysql > create database xhprof;

xhprof gui a besoin d'une table details dans la base xhprof. La description de la table est décrite dans le fichier Mysqli.

 CREATE TABLE `details` (
`id` char(17) NOT NULL,
`url` varchar(255) default NULL,
`c_url` varchar(255) default NULL,
`timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`server name` varchar(64) default NULL,
`perfdata` MEDIUMBLOB,
`type` tinyint(4) default NULL,
`cookie` BLOB,
`post` BLOB,
`get` BLOB,
`pmu` int(11) unsigned default NULL,
`wt` int(11) unsigned default NULL,
`cpu` int(11) unsigned default NULL,
`server_id` char(3) NOT NULL default 't11',
`aggregateCalls_include` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `url` (`url`),
KEY `c_url` (`c_url`),
KEY `cpu` (`cpu`),
KEY `wt` (`wt`),
KEY `pmu` (`pmu`),
KEY `timestamp` (`timestamp`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Il est ensuite nécessaire de créer un Virtual Host pour accéder à xhprof gui :

<VirtualHost *:80>
   DocumentRoot /mon/super/chemin/vers/xhprofgui/xhprof_html
   ServerName xhprof.local
   DirectoryIndex index.php
</VirtualHost>

N'oubliez pas de l'activer et d'ajouter dans votre fichier /etc/hosts une entrée pour ce nouveau domaine.

Il est nécessaire de modifier le fichier xhprof_lib/config.php avec les paramètres qui vont bien.

Voici les premières lignes du fichier config.php que j'utilise :

<?php
$_xhprof = array();

// Change these:
$_xhprof['dbhost'] = 'localhost';
$_xhprof['dbuser'] = 'root';
$_xhprof['dbpass'] = 'root';
$_xhprof['dbname'] = 'xhprof';
$_xhprof['servername'] = 'myserver';
$_xhprof['namespace'] = 'myapp';
$_xhprof['url'] = 'http://xhprof.local/';

//These are good for linux and its derivatives.
//*
$_xhprof['dot_binary']  = '/usr/bin/dot';
$_xhprof['dot_tempdir'] = '/tmp';
$_xhprof['dot_errfile'] = '/tmp/xh_dot.err';
//*/

$exceptionURLs = array();

$exceptionPostURLs = array();
$exceptionPostURLs[] = "login";


$_xhprof['display'] = false;
$_xhprof['doprofile'] = true;

$controlIPs = array();
$controlIPs[] = "127.0.0.1";   //Localhost, you'll want to add your own ip here
$controlIPs[] = "ma super ip personnelle";   // Je bosse sous Windows (on ne choisit pas toujours...) mais mon serveur est dans une VM. J'indique l'IP de mon Windows.

$otherURLS = array();

$weight = 100;

Ensuite pour tous les virtual hosts que vous souhaiteraient monitorer, vous pouvez ajouter les lignes suivantes dans la configuration du VH :

php_admin_value auto_prepend_file "/mon/super/chemin/vers/xhprofgui/external/header.php"

Désormais en bas de chaque page, vous disposerez normalement d'un lien permettant d'accéder au profiling de la page courante.

Dernier point, si vous souhaitez générer des graphiques de ce type xhprof gui callgraph, il est nécessaire d'installer graphviz :

$ sudo apt-get install graphviz

J'espère que ces quelques notes vous aiderons à débuter avec xhprof.

Cet article s'est largement inspiré de profiling php application?

Edit 27/11/2012 : Correction suite à commentaire d'un visiteur.

APC et Zend Server

Une des limitations du cache de Zend Server (ShMem ou Disk) est de ne pas proposer d'outils de monitoring des éléments mis en cache. Apc propose cela par défaut via l'installation du script apc.php.

Zend Server propose, par défaut, une émulation de APC via le Zend DataCache. Cependant, cette émulation ne propose pas toute l'API de APC. Le script apc.php ne fonctionne donc pas. Je n'ai pas trop cherché mais, a priori, cela vient du non support complet des méthodes suivantes apc_compile_file(), apc_sma_info(), apc_cache_info() (voir forum chez phpfrance).

Je viens de découvrir que Zend mettait à disposition un paquet Apc.

Pour l'installer sur une debian/ubuntu, il suffit de :

# php-5.2
sudo apt-get install php-5.2-apc-zend-server
# php-5.3
sudo apt-get install php-5.3-apc-zend-server

puis redémarrer Apache (vérifier au préalable que le fichier /usr/local/zend/etc/conf.d/apc.ini est bien présent)

Il est donc ensuite possible de charger l'extension apc.so dans son php.ini. A nous les joies de l'utilisation de apc.php avec Zend Server.

- page 1 de 3

à propos :: Mots-clés :: archives :: RSS :: Mail