Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Plein phar !

2,338 views

Published on

Published in: Technology
  • Be the first to comment

Plein phar !

  1. 1. Plein PHAR ! ConFoo 2011 du 9 au 11 mars 2011 Montréal Hôtel Hilton BonaventureLes scripts utilisés pour cette conférence sont disponibles à ladresse http://medias.mageekbox.net/conferences/ConFoo2011/ Frédéric Hardy frederic.hardy@mageekbox.net http://blog.mageekbox.net @mageekguy
  2. 2. Plein PHAR ! À propos● Frédéric Hardy● 34 ans.● Plus de 11 ans dexpérience.● Architecte logiciel chez PMSIpilot.● Créateur du framework de tests unitaire Atoum.● Contributeur à PHP● Contributeur à divers projet PHP.● Mon blog : http://blog.mageekbox.net
  3. 3. Plein PHAR ! Préambule PHP ≥ 5.3 ● php.ini ● detect_unicode=0 ● suhosin.executor.include.whitelist="phar"# wget http://medias.mageekbox.net/conferences/ConFoo2011/# php ConFoo2011.phar –e
  4. 4. Plein PHAR ! Plan1. Feux de position2. Feux de croisement3. Feux de route 4
  5. 5. Plein PHAR !Feu de position 1.Description 2.Historique 3.Installation 5
  6. 6. Plein PHAR ! Description ● PHAR = PHP Archive. ● PHAR est à PHP ce que JAR est à Java. ● Concatène plusieurs fichiers en un seul. – Facilite la distribution. – Permet lexécution via un seul fichier Via différentes SAPI. ● ● Supporte divers format de compression. 6Feux de position
  7. 7. Plein PHAR ! Historique ● Extension PECL – Créée par ● Steph Fox (php|architect). ● Greg Beaver (contributeur PEAR/PECL). ● Marcus Börger (parmi les auteurs de PHP 5). – Version 1 en 2007 – Version 2 en 2009 ● Intégrée à PHP depuis PHP 5.3. 7Feux de position
  8. 8. Plein PHAR ! Configuration minimum ● PHP version 5.2 et supérieure. ● SPL, intégrée à PHP 5.3. ● Compression – Extension PHP zlib. – Extension PHP bzip2. ● Sécurisation – Extension openssl. 8Feux de position ► Installation
  9. 9. Plein PHAR ! Directives ● Ne pas utiliser –disable-phar lors du ./configure. ● Ne pas utiliser –zend-enable-multibyte lors du ./configure. ● phar.readonly ● phar.require_hash ● phar.cache_list 9Feux de position ► Installation
  10. 10. Plein PHAR !Feu de croisement 1.Fonctionnement 2.Compatibilité 3.Structure 4.Création 5.Utilisation 6.Modification 10
  11. 11. Plein PHAR ! Fonctionnement ● Rassemble plusieurs fichiers de nature différente en un seul. ● Lisible par PHP directement. – Flux phar:://. ● Informations extraites à la demande. ● Utilisable par toutes les fonctions supportant les flux. 11Feux de croisement
  12. 12. Plein PHAR ! Compatibilité ● Au niveau de PHP : – Utilisable uniquement par PHP 5.3+ et lextension PECL correspondante. ● Pour le reste du monde : – Les PHAR au format PHAR ne sont lisibles que par PHP. – Les PHAR au format ZIP/TAR sont lisibles par les utilitaires concernés. 12Feux de croisement
  13. 13. Plein PHAR ! Structure 1.Un fichier de démarrage (stub). 2.Un manifeste décrivant la structure du PHAR. • Chemin daccès + permissions 3.Les fichiers. 4.Une signature optionnelle. 13Feux de croisement
  14. 14. Plein PHAR ! Le fichier de démarrage ● Interprété : – lorsque le PHAR est exécuté. – Lorsque le PHAR est inclus dans un script PHP. ● Permet de définir lenvironnement dexécution du PHAR : – Autoload. – Lecture de fichiers de configuration externe. – etc. 14Feux de croisement ► Structure
  15. 15. Plein PHAR ! Création ● Création impossible par défaut : – phar.readonly à 0 dans le php.ini. ● -d phar.readonly = 0 en ligne de commande. ● À ne pas utiliser en production. 15Feux de croisement
  16. 16. Plein PHAR ! Script 001-helloConFoo2011.php <?php $phar = new Phar(ConFoo2011.phar); $phar[index.php] = <?php echo "Hello ConFoo 2011 !n"; ?>; $phar->createDefaultStub(); ?> # php -d phar.readonly 001-helloConFoo2011.php # php helloConFoo2011.phar 16Feux de croisement ► Création
  17. 17. Plein PHAR ! Définition du fichier de démarrage ● Doit : – contenir du code PHP valide. – se terminer par __HALT_COMPILER(). ● La balise ?> nest pas obligatoire. ● Peut être extrait à laide de Phar::getStub(). 002-getStub.php <?php $phar = new Phar(helloConFoo2011.phar); var_dump($phar->getStub()); ?> 17Feux de croisement ► Création
  18. 18. Plein PHAR ! Les fichiers de démarrage par défaut ● Intégrable via : – Phar::createDefaultStub() – Phar::setDefaultStub() et Phar::setStub(). ● Utilisable en ligne de commande et sur le Web. 003-setDefaultStub.php <?php $phar = new Phar(helloConFoo2011.phar); $phar[cli.php] = <?php echo "Hello ConFoo 2011 !n"; ?>; $phar[web.php] = <?php echo "<h1>Hello ConFoo 2011 !</h1>"; ?>; $phar->setDefaultStub(cli.php, web.php); ?> 18Feux de croisement ► Création
  19. 19. Plein PHAR ! Ajout de fichiers ● Plusieurs méthodes possibles – Via linterface arrayAccess. – Via Phar::addFile(). – Via Phar::addFromString(). – Via Phar::addEmptyDir(). – Via Phar::buildFromDirectory(). – Via Phar::buildFromIterator() ● Doit retourner des instances de SplFileInfo. 19Feux de croisement ► Création
  20. 20. Plein PHAR ! Signature de larchive ● Permet de vérifier lintégrité dun PHAR. ● Phar::setSignatureAlgorithm(), accepte Phar::MD5, Phar::SHA1, Phar::SHA256, Phar::SHA512 et Phar::OPENSSL. ● Phar::getSignature() permet dextraire dune archive PHAR sa signature. 004-signature.php <?php $phar = new Phar(helloConFoo2011.phar); $phar->setSignatureAlgorithm(phar::SHA1); $phar->setStub(<?php $phar = new phar(__FILE__); var_dump($pharData->getSignature()); include(phar://helloConFoo2011.phar/index.php); __HALT_COMPILER(); ); ?> 20Feux de croisement ► Création
  21. 21. Plein PHAR ! Utilisation ● En ligne de commande. ● Via include/require. ● Via le flux phar:// et les fonctions les supportants. ● Via recursiveDirectoryIterator. ● Via les interfaces : – arrayAccess. – countable. – iterator. – traversable. 21Feux de croisement
  22. 22. Plein PHAR ! Exemples 005-usingPhar.php <?php include(phar://helloConFoo2011.phar/index.php); file_get_contents(phar://helloConFoo2011.phar/index.php); $phar = new phar(helloConFoo2011.phar); var_dump($phar[index.php]); var_dump($phar[cli.php]); var_dump($phar[web.php]); foreach ($phar as $file) { var_dump($file); } var_dump(sizeof($phar); ?> 22Feux de croisement ► Utilisation
  23. 23. Plein PHAR ! Extraction de fichiers ● Possible à laide de Phar::extractTo(). ● Permet dextraire la totalité ou seulement certains fichiers dune archive. 006-extractTo.php <?php $phar = new phar(helloConFoo2011.phar); $phar->extractTo(__DIR__, array(index.php), true); ?> 23Feux de croisement ► Utilisation
  24. 24. Plein PHAR ! Feux de route1.Méta-données2.Formats et Compressions3.Point de montage.4.Tests unitaires5.Performances6.Cas pratique 24
  25. 25. Plein PHAR ! Méta-données ● Phar::(set|has|get|del)MetaData() 007-metadata.php <?php $phar = new Phar(helloConFoo2011.phar); $phar->setMetaData(array( country => Canada, city => Montréal, location => Hôtel Bonaventure, creator => PHP Québec, Montréal-Python, Montreal.rb, W3Qc et OWASP, date => date(d/m/Y h:i:s) )); $phar->setStub(<?php $phar = new phar(__FILE__); var_dump($pharData->getMetaData()); include(phar://helloConFoo2011.phar/index.php); __HALT_COMPILER(); ); ?> 25Feux de route
  26. 26. Plein PHAR ! Formats et compression ● PHAR non exécutable et Compressions possibles : exécutable Phar::NONE. Phar::GZ (zlib). ● Formats disponibles : Phar::BZ2 (bzip2). – Phar::ZIP. – Phar::TAR. Phar::TAR Phar::ZIP Phar::NONE .tar .zip Phar::GZ .tar.gz .zip Phar::BZ2 .tar.bz2 .zip 26Feux de route
  27. 27. Plein PHAR ! PHAR non exécutable ● Le nom de larchive ne doit pas contenir .phar. ● Na pas de fichier de démarrage. ● Via PharData::__construct() ou Phar::convertToData(). 008-convertToData.php <?php $phar = new Phar(ConFoo2011.phar); $pharData = $phar->convertToData(Phar::TAR); var_dump($pharData->getStub(); $pharData = $phar->convertToData(Phar::TAR, Phar::GZ); var_dump($pharData->getStub(); ?> 27Feux de route ► Formats et compressions
  28. 28. Plein PHAR ! PHAR exécutable ● Le nom de larchive doit contenir .phar. ● Création : – Via Phar::__construct() et Phar::setStub(). – Via PharData::convertToExecutable() ● Attention au fichier de démarrage. ● Via Phar::convertToExecutable(). 009-convertToExecutable.php <?php $pharData = new PharData(helloConFoo2011.tar); $phar->convertToExecutable(Phar::PHAR, Phar::GZ); $phar->createDefaultStub(cli.php, web.php); ?> 28Feux de route ► Formats et compressions
  29. 29. Plein PHAR ! Compression locale et/ou globale ● Possible de ne compresser que certain fichier dans un PHAR : – Phar::compressFiles(). – PharData::compressFiles(). ● Possible de compresser globalement un PHAR : – Phar::compress(). – PharData::compress(). 29Feux de route ► Formats et compressions
  30. 30. Plein PHAR ! Décompression ● Implicite lors dune utilisation. ● Possible explicitement à laide des méthodes : – Phar::decompress(). – PharData::decompress(). – Phar::decompressFiles(). – PharData::decompressFiles(). 30Feux de route ► Formats et compressions
  31. 31. Plein PHAR ! Point de montage ● Phar::mount() permet dintégrer un fichier externe à un PHAR. ● Utile pour la configuration, les journaux dévénements, etc. ● Le montage peut se faire de lintérieur ou de lextérieur de larchive. 010-mount.php <?php $pharData = new PharData(helloConFoo2011.tar); $phar->setStub(<?php Phar::mount(__DIR__ . "/config.php", "config.php"); require("config.php"); echo "Hello $who !n"; __HALT_COMPILER(); ); ?> 31Feux de route
  32. 32. Plein PHAR ! Tests unitaires ● Comment tester la création dun PHAR ? – Validation du fichier de démarrage ? – Vérification des fichiers inclus ? – Signature du bon type ? – etc. 32Feux de route
  33. 33. Plein PHAR ! Tests unitaires ● Solution ? – Créer effectivement le PHAR. ● Et si environnement de développement avec PHP < 5.3 ? – Injection de dépendances – Stub/Mock 33Feux de route
  34. 34. Plein PHAR ! Exemple 011-atoumTest.php ... $this->assert ->object($generator->run())->isIdenticalTo($generator) ->mock($phar) ->call(__construct, array( $generator->getDestinationDirectory() . / . atoumphargenerator::phar, null, null )) ->call(setMetadata, array(array( version => atoumtest::getVersion(), author => atoumtest::author, ... ))) ->call(setStub, array(<?php phar::mapPhar( . phargenerator::phar . ); require(phar:// . phargenerator::phar . /classes/autoloader.php); if (PHP_SAPI === cli)... ->call(setSignatureAlgorithm, array(phar::SHA1,null) ... 34Feux de route ► Tests unitaires
  35. 35. Plein PHAR ! Performances ● Phar::TAR plus efficace que Phar::ZIP – Mais noms de fichiers limité à 255 caractères. ● Perte de performance légère sans compression. ● Perte de 10 à 15% avec compression. ● Lutilisation de la directive phar.cache_list règle le problème. ● APC peut augmenter les performances jusquà un facteur 6 ! 35Feux de route
  36. 36. Plein PHAR ! Une preuve ? # php scripts/runners/directory.php -d tests/units/classes/ > Atoum version 133 par Frédéric Hardy. ... > Total tests duration: 3.76 seconds. > Total tests memory usage: 47.25 Mb. > Running duration: 9.91 seconds. > Success (56 tests, 228 methods, 3615 assertions) ! # php mageekguy.atoum.phar –testIt > Atoum version 133 par Frédéric Hardy. ... > Total tests duration: 2.18 seconds. > Total tests memory usage: 36.50 Mb. > Running duration: 6.34 seconds. > Success (56 tests, 228 methods, 3615 assertions) ! 36Feux de route
  37. 37. Plein PHAR ! Un cas pratique : Atoum ● En ligne de commande # php mageekguy.atoum.phar --help Usage: php mageekguy.atoum.phar [options] Atoum version 105 by Frédéric Hardy. Available options are: -h, --help: Display this help -i, --infos: Display informations -s, --signature: Display phar signature -e <dir>, --extract <dir>: Extract all file in <dir> 37Feux de route ► Cas pratique
  38. 38. Plein PHAR ! Atoum ● Dans le code <?php require mageekguy.atoum.phar; class boolean extends mageekguyatoumtest { public function testTrue() { $this->assert->boolean(true)->isTrue(); } } ?> 38Feux de route ► Cas pratique
  39. 39. Plein PHAR ! Retour dexpérience● Utilisé pour lun des sites de démonstration dIE9.● Window Azure● CLI● Zend Framework 1.10.x. 39
  40. 40. Plein PHAR ! Les inconvénients● Non supporté par les IDE.● Peu naturel pour les développeurs PHP.● Peu de documentation.● detect_unicode=0, notamment sous MACOS X.● suhosin.executor.include.whitelist 40
  41. 41. Plein PHAR ! Les avantages● Intégré à PHP.● Facile à déployer.● Facile à utiliser.● Utilisable sur toutes les SAPI.● Performance.● Supporte plusieurs format.● Sera utilisé par Symfony 2 et Zend Framework 2 41
  42. 42. Plein PHAR ! Références● http://php.net/phar● http://blog.pascal-martin.fr/post/php-5.3-phar-php-archive● http://blog.mageekbox.net 42
  43. 43. Plein PHAR !Questions ? 43
  44. 44. Plein PHAR ! Remerciements● Merci aux organisateurs de la ConFoo 2011.● Merci à vous.Cette conférence est maintenant terminée, vous pouvez reprendre une activité normale. frederic.hardy@mageekbox.net http://blog.mageekbox.net @mageekguy 44

×