Plein phar !

2,237 views
2,165 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,237
On SlideShare
0
From Embeds
0
Number of Embeds
208
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

×