SlideShare uma empresa Scribd logo
1 de 44
Baixar para ler offline
Plein PHAR !

                 ConFoo 2011
             du 9 au 11 mars 2011
                   Montréal
                            Hôtel Hilton Bonaventure




Les scripts utilisés pour cette conférence sont disponibles à l'adresse

    http://medias.mageekbox.net/conferences/ConFoo2011/




                           Frédéric Hardy

      frederic.hardy@mageekbox.net  http://blog.mageekbox.net  @mageekguy
Plein PHAR !

                         À propos
●   Frédéric Hardy
●   34 ans.
●   Plus de 11 ans d'expé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
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
Plein PHAR !

        Plan


1. Feux de position
2. Feux de croisement
3. Feux de route




                        4
Plein PHAR !

Feu de position


 1.Description
 2.Historique
 3.Installation




                  5
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 l'exécution via un seul fichier
                       Via différentes SAPI.
                        ●


               ●   Supporte divers format de compression.


                                                                6
Feux de position
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.

                                                                 7
Feux de position
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.


                                                  8
Feux de position ► Installation
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

                                                  9
Feux de position ► Installation
Plein PHAR !

Feu de croisement

 1.Fonctionnement
 2.Compatibilité
 3.Structure
 4.Création
 5.Utilisation
 6.Modification


                    10
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.


                                                          11
Feux de croisement
Plein PHAR !

                          Compatibilité

     ●   Au niveau de PHP :
         –   Utilisable uniquement par PHP 5.3+ et l'extension
             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.


                                                                 12
Feux de croisement
Plein PHAR !

                                  Structure

     1.Un fichier de démarrage (stub).
     2.Un manifeste décrivant la structure du PHAR.
         •   Chemin d'accès + permissions

     3.Les fichiers.
     4.Une signature optionnelle.




                                                      13
Feux de croisement
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 l'environnement d'exécution
         du PHAR :
          –   Autoload.
          –   Lecture de fichiers de configuration externe.
          –   etc.

                                                               14
Feux de croisement ► Structure
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.




                                                      15
Feux de croisement
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


                                                       16
Feux de croisement ► Création
Plein PHAR !

              Définition du fichier de démarrage
     ●   Doit :
          –   contenir du code PHP valide.
          –   se terminer par __HALT_COMPILER().
     ●   La balise ?> n'est pas obligatoire.
     ●   Peut être extrait à l'aide de Phar::getStub().
    002-getStub.php
    <?php

    $phar = new Phar('helloConFoo2011.phar');
    var_dump($phar->getStub());

    ?>

                                                           17
Feux de croisement ► Création
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');

   ?>


                                                                  18
Feux de croisement ► Création
Plein PHAR !

                                Ajout de fichiers

     ●   Plusieurs méthodes possibles
         –   Via l'interface arrayAccess.
         –   Via Phar::addFile().
         –   Via Phar::addFromString().
         –   Via Phar::addEmptyDir().
         –   Via Phar::buildFromDirectory().
         –   Via Phar::buildFromIterator()
               ●   Doit retourner des instances de SplFileInfo.

                                                                   19
Feux de croisement ► Création
Plein PHAR !

                         Signature de l'archive
     ●   Permet de vérifier l'intégrité d'un PHAR.
     ●   Phar::setSignatureAlgorithm(), accepte Phar::MD5,
         Phar::SHA1, Phar::SHA256, Phar::SHA512 et Phar::OPENSSL.
     ●   Phar::getSignature() permet d'extraire d'une 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();'
    );

    ?>
                                                                         20
Feux de croisement ► Création
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.

                                                                         21
Feux de croisement
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);

    ?>
                                                                  22
Feux de croisement ► Utilisation
Plein PHAR !

                            Extraction de fichiers

     ●    Possible à l'aide de Phar::extractTo().
     ●    Permet d'extraire la totalité ou seulement
          certains fichiers d'une archive.

     006-extractTo.php
     <?php

     $phar = new phar('helloConFoo2011.phar');
     $phar->extractTo(__DIR__, array('index.php'), true);

     ?>



                                                            23
Feux de croisement ► Utilisation
Plein PHAR !

     Feux de route

1.Méta-données
2.Formats et Compressions
3.Point de montage.
4.Tests unitaires
5.Performances
6.Cas pratique


                            24
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();'
   );

   ?>

                                                                            25
Feux de route
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


                                                                        26
Feux de route
Plein PHAR !

                         PHAR non exécutable
    ●    Le nom de l'archive ne doit pas contenir .phar.
    ●    N'a 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();

    ?>



                                                               27
Feux de route ► Formats et compressions
Plein PHAR !

                              PHAR exécutable
     ●   Le nom de l'archive 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');

    ?>

                                                              28
Feux de route ► Formats et compressions
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().

                                                         29
Feux de route ► Formats et compressions
Plein PHAR !

                                Décompression

     ●   Implicite lors d'une utilisation.
     ●   Possible explicitement à l'aide des méthodes :
          –   Phar::decompress().
          –   PharData::decompress().
          –   Phar::decompressFiles().
          –   PharData::decompressFiles().



                                                          30
Feux de route ► Formats et compressions
Plein PHAR !

                           Point de montage
     ●   Phar::mount() permet d'intégrer un fichier externe à un PHAR.
     ●   Utile pour la configuration, les journaux d'événements, etc.
     ●   Le montage peut se faire de l'intérieur ou de l'extérieur de l'archive.
     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();'
    );

    ?>

                                                                                   31
Feux de route
Plein PHAR !

                              Tests unitaires

     ●   Comment tester la création d'un PHAR ?
          –     Validation du fichier de démarrage ?
          –     Vérification des fichiers inclus ?
          –     Signature du bon type ?
          –     etc.




                                                       32
Feux de route
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




                                                                         33
Feux de route
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)
     ...
                                                                                        34
Feux de route ► Tests unitaires
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.
        ●   L'utilisation de la directive phar.cache_list
            règle le problème.
        ●   APC peut augmenter les performances jusqu'à un
            facteur 6 !

                                                                     35
Feux de route
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) !
                                                           36
Feux de route
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>


                                                                    37
Feux de route ► Cas pratique
Plein PHAR !

                                 Atoum

     ●   Dans le code
    <?php

    require 'mageekguy.atoum.phar';

    class boolean extends mageekguyatoumtest {
       public function testTrue() {
           $this->assert->boolean(true)->isTrue();
       }
    }

    ?>




                                                     38
Feux de route ► Cas pratique
Plein PHAR !

              Retour d'expérience

●   Utilisé pour l'un des sites de démonstration
    d'IE9.
●   Window Azure
●   CLI
●   Zend Framework 1.10.x.




                                                   39
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
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
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
Plein PHAR !




Questions ?




               43
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

Mais conteúdo relacionado

Destaque

Traits : de la théorie à la pratique
Traits : de la théorie à la pratiqueTraits : de la théorie à la pratique
Traits : de la théorie à la pratiqueFrederic Hardy
 
PHP : retour vers le futur !
PHP : retour vers le futur !PHP : retour vers le futur !
PHP : retour vers le futur !Frederic Hardy
 
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Frederic Hardy
 
Télés connectées et développement Web
Télés connectées et développement WebTélés connectées et développement Web
Télés connectées et développement WebJean-Pierre Vincent
 

Destaque (9)

Traits : de la théorie à la pratique
Traits : de la théorie à la pratiqueTraits : de la théorie à la pratique
Traits : de la théorie à la pratique
 
PHP : retour vers le futur !
PHP : retour vers le futur !PHP : retour vers le futur !
PHP : retour vers le futur !
 
TDD avec atoum
TDD avec atoumTDD avec atoum
TDD avec atoum
 
Anatomie du test
Anatomie du testAnatomie du test
Anatomie du test
 
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
Atoum, le framework de tests unitaires pour PHP 5.3 simple, moderne et intuit...
 
Atoum
AtoumAtoum
Atoum
 
TDD avec atoum
TDD avec atoumTDD avec atoum
TDD avec atoum
 
Plein PHAR !
Plein PHAR !Plein PHAR !
Plein PHAR !
 
Télés connectées et développement Web
Télés connectées et développement WebTélés connectées et développement Web
Télés connectées et développement Web
 

Semelhante a Plein phar !

Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]Wixiweb
 
Apache for développeurs PHP
Apache for développeurs PHPApache for développeurs PHP
Apache for développeurs PHPjulien pauli
 
hassclic270.ppt
hassclic270.ppthassclic270.ppt
hassclic270.pptadiouf2
 
Php 7.4 2020-01-28 - afup
Php 7.4   2020-01-28 - afupPhp 7.4   2020-01-28 - afup
Php 7.4 2020-01-28 - afupJulien Vinber
 
Installation Joomla15 18 08 08
Installation Joomla15 18 08 08Installation Joomla15 18 08 08
Installation Joomla15 18 08 08guest8283f
 
Gestion des dépendances dans un projet PHP - Forum PHP 2012
Gestion des dépendances dans un projet PHP - Forum PHP 2012Gestion des dépendances dans un projet PHP - Forum PHP 2012
Gestion des dépendances dans un projet PHP - Forum PHP 2012Jean-Marc Fontaine
 
20100221 my phingtool - blog
20100221   my phingtool - blog20100221   my phingtool - blog
20100221 my phingtool - blogPHPPRO
 
Installation joomla 1-7
Installation joomla 1-7Installation joomla 1-7
Installation joomla 1-7Deux MI
 
Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4Damien Seguy
 
Installation joomla15
Installation joomla15Installation joomla15
Installation joomla15Becem Ghalleb
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015Stéphane Legrand
 
Mieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyMieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyHugo Hamon
 
Installation de PHP
Installation de PHPInstallation de PHP
Installation de PHPMoncef Essid
 
Gestion des dépendances dans un projet PHP - RMLL 2012
Gestion des dépendances dans un projet PHP - RMLL 2012Gestion des dépendances dans un projet PHP - RMLL 2012
Gestion des dépendances dans un projet PHP - RMLL 2012Jean-Marc Fontaine
 

Semelhante a Plein phar ! (20)

Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]Présentation de PHP 5.4 [FR]
Présentation de PHP 5.4 [FR]
 
Apache for développeurs PHP
Apache for développeurs PHPApache for développeurs PHP
Apache for développeurs PHP
 
hassclic270.ppt
hassclic270.ppthassclic270.ppt
hassclic270.ppt
 
Php 7.4 2020-01-28 - afup
Php 7.4   2020-01-28 - afupPhp 7.4   2020-01-28 - afup
Php 7.4 2020-01-28 - afup
 
Xhprof
XhprofXhprof
Xhprof
 
@Readme code s-sources-fr
@Readme code s-sources-fr@Readme code s-sources-fr
@Readme code s-sources-fr
 
Installation Joomla15 18 08 08
Installation Joomla15 18 08 08Installation Joomla15 18 08 08
Installation Joomla15 18 08 08
 
Gestion des dépendances dans un projet PHP - Forum PHP 2012
Gestion des dépendances dans un projet PHP - Forum PHP 2012Gestion des dépendances dans un projet PHP - Forum PHP 2012
Gestion des dépendances dans un projet PHP - Forum PHP 2012
 
20100221 my phingtool - blog
20100221   my phingtool - blog20100221   my phingtool - blog
20100221 my phingtool - blog
 
Installation joomla 1-7
Installation joomla 1-7Installation joomla 1-7
Installation joomla 1-7
 
Installation joomla 1-7
Installation joomla 1-7Installation joomla 1-7
Installation joomla 1-7
 
Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4
 
Installation joomla15
Installation joomla15Installation joomla15
Installation joomla15
 
Php
PhpPhp
Php
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015
 
PHP Training
PHP TrainingPHP Training
PHP Training
 
Lp web tp3_idse
Lp web tp3_idseLp web tp3_idse
Lp web tp3_idse
 
Mieux Développer en PHP avec Symfony
Mieux Développer en PHP avec SymfonyMieux Développer en PHP avec Symfony
Mieux Développer en PHP avec Symfony
 
Installation de PHP
Installation de PHPInstallation de PHP
Installation de PHP
 
Gestion des dépendances dans un projet PHP - RMLL 2012
Gestion des dépendances dans un projet PHP - RMLL 2012Gestion des dépendances dans un projet PHP - RMLL 2012
Gestion des dépendances dans un projet PHP - RMLL 2012
 

Plein phar !

  • 1. Plein PHAR ! ConFoo 2011 du 9 au 11 mars 2011 Montréal Hôtel Hilton Bonaventure Les scripts utilisés pour cette conférence sont disponibles à l'adresse http://medias.mageekbox.net/conferences/ConFoo2011/ Frédéric Hardy frederic.hardy@mageekbox.net http://blog.mageekbox.net @mageekguy
  • 2. Plein PHAR ! À propos ● Frédéric Hardy ● 34 ans. ● Plus de 11 ans d'expé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. 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. Plein PHAR ! Plan 1. Feux de position 2. Feux de croisement 3. Feux de route 4
  • 5. Plein PHAR ! Feu de position 1.Description 2.Historique 3.Installation 5
  • 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 l'exécution via un seul fichier Via différentes SAPI. ● ● Supporte divers format de compression. 6 Feux de position
  • 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. 7 Feux de position
  • 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. 8 Feux de position ► Installation
  • 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 9 Feux de position ► Installation
  • 10. Plein PHAR ! Feu de croisement 1.Fonctionnement 2.Compatibilité 3.Structure 4.Création 5.Utilisation 6.Modification 10
  • 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. 11 Feux de croisement
  • 12. Plein PHAR ! Compatibilité ● Au niveau de PHP : – Utilisable uniquement par PHP 5.3+ et l'extension 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. 12 Feux de croisement
  • 13. Plein PHAR ! Structure 1.Un fichier de démarrage (stub). 2.Un manifeste décrivant la structure du PHAR. • Chemin d'accès + permissions 3.Les fichiers. 4.Une signature optionnelle. 13 Feux de croisement
  • 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 l'environnement d'exécution du PHAR : – Autoload. – Lecture de fichiers de configuration externe. – etc. 14 Feux de croisement ► Structure
  • 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. 15 Feux de croisement
  • 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 16 Feux de croisement ► Création
  • 17. Plein PHAR ! Définition du fichier de démarrage ● Doit : – contenir du code PHP valide. – se terminer par __HALT_COMPILER(). ● La balise ?> n'est pas obligatoire. ● Peut être extrait à l'aide de Phar::getStub(). 002-getStub.php <?php $phar = new Phar('helloConFoo2011.phar'); var_dump($phar->getStub()); ?> 17 Feux de croisement ► Création
  • 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'); ?> 18 Feux de croisement ► Création
  • 19. Plein PHAR ! Ajout de fichiers ● Plusieurs méthodes possibles – Via l'interface arrayAccess. – Via Phar::addFile(). – Via Phar::addFromString(). – Via Phar::addEmptyDir(). – Via Phar::buildFromDirectory(). – Via Phar::buildFromIterator() ● Doit retourner des instances de SplFileInfo. 19 Feux de croisement ► Création
  • 20. Plein PHAR ! Signature de l'archive ● Permet de vérifier l'intégrité d'un PHAR. ● Phar::setSignatureAlgorithm(), accepte Phar::MD5, Phar::SHA1, Phar::SHA256, Phar::SHA512 et Phar::OPENSSL. ● Phar::getSignature() permet d'extraire d'une 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();' ); ?> 20 Feux de croisement ► Création
  • 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. 21 Feux de croisement
  • 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); ?> 22 Feux de croisement ► Utilisation
  • 23. Plein PHAR ! Extraction de fichiers ● Possible à l'aide de Phar::extractTo(). ● Permet d'extraire la totalité ou seulement certains fichiers d'une archive. 006-extractTo.php <?php $phar = new phar('helloConFoo2011.phar'); $phar->extractTo(__DIR__, array('index.php'), true); ?> 23 Feux de croisement ► Utilisation
  • 24. Plein PHAR ! Feux de route 1.Méta-données 2.Formats et Compressions 3.Point de montage. 4.Tests unitaires 5.Performances 6.Cas pratique 24
  • 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();' ); ?> 25 Feux de route
  • 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 26 Feux de route
  • 27. Plein PHAR ! PHAR non exécutable ● Le nom de l'archive ne doit pas contenir .phar. ● N'a 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(); ?> 27 Feux de route ► Formats et compressions
  • 28. Plein PHAR ! PHAR exécutable ● Le nom de l'archive 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'); ?> 28 Feux de route ► Formats et compressions
  • 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(). 29 Feux de route ► Formats et compressions
  • 30. Plein PHAR ! Décompression ● Implicite lors d'une utilisation. ● Possible explicitement à l'aide des méthodes : – Phar::decompress(). – PharData::decompress(). – Phar::decompressFiles(). – PharData::decompressFiles(). 30 Feux de route ► Formats et compressions
  • 31. Plein PHAR ! Point de montage ● Phar::mount() permet d'intégrer un fichier externe à un PHAR. ● Utile pour la configuration, les journaux d'événements, etc. ● Le montage peut se faire de l'intérieur ou de l'extérieur de l'archive. 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();' ); ?> 31 Feux de route
  • 32. Plein PHAR ! Tests unitaires ● Comment tester la création d'un PHAR ? – Validation du fichier de démarrage ? – Vérification des fichiers inclus ? – Signature du bon type ? – etc. 32 Feux de route
  • 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 33 Feux de route
  • 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) ... 34 Feux de route ► Tests unitaires
  • 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. ● L'utilisation de la directive phar.cache_list règle le problème. ● APC peut augmenter les performances jusqu'à un facteur 6 ! 35 Feux de route
  • 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) ! 36 Feux de route
  • 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> 37 Feux de route ► Cas pratique
  • 38. Plein PHAR ! Atoum ● Dans le code <?php require 'mageekguy.atoum.phar'; class boolean extends mageekguyatoumtest { public function testTrue() { $this->assert->boolean(true)->isTrue(); } } ?> 38 Feux de route ► Cas pratique
  • 39. Plein PHAR ! Retour d'expérience ● Utilisé pour l'un des sites de démonstration d'IE9. ● Window Azure ● CLI ● Zend Framework 1.10.x. 39
  • 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. 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. 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
  • 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