SlideShare une entreprise Scribd logo
1  sur  40
Télécharger pour lire hors ligne
Plein PHAR !
Forum PHP 2010Forum PHP 2010
9 et 10 novembre9 et 10 novembre
ParisParis
cité des sciences et de l'industriecité des sciences et de l'industrie
Frédéric Hardy
frederic.hardy@mageekbox.net  http://blog.mageekbox.net  @mageekguy
Les scripts utilisés pour cette conférence sont disponibles à l'adresse
http://medias.mageekbox.net/conferences/forumPHP2010/
Plein PHAR !
Préambule
# php forumPHP2010.phar –e
suhosin.executor.include.whitelist="phar"
3
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 !
● 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.
Description
Feux de positionFeux de position
6
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.
Feux de positionFeux de position
7
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.
Feux de positionFeux de position ►► InstallationInstallation
8
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
Feux de positionFeux de position ►► InstallationInstallation
9
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.
Feux de croisementFeux de croisement
11
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.
Feux de croisementFeux de croisement
12
Plein PHAR !
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.
Structure
Feux de croisementFeux de croisement
13
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.
Feux de croisementFeux de croisement ►► StructureStructure
14
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.
Feux de croisementFeux de croisement
15
Plein PHAR !
Script
<?php
$phar = new Phar('helloForumPHP2010.phar');
$phar['index.php'] =
'<?php echo "Hello Forum PHP 2010 !n"; ?>'
;
$phar->createDefaultStub();
?>
Feux de croisementFeux de croisement ►► CréationCréation
# php -d phar.readonly 001-helloForumPHP2010.php
# php helloForumPHP2010.phar
16
Plein PHAR !
● 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().
<?php
$phar = new Phar('helloworld.phar');
var_dump($phar->getStub());
?>
Feux de croisementFeux de croisement ►► CréationCréation
Définition du fichier de démarrage
17
Plein PHAR !
● Intégrable via :
– Phar::createDefaultStub()
– Phar::setDefaultStub() et Phar::setStub().
● Utilisable en ligne de commande et sur le Web.
<?php
$phar = new Phar('helloForumPHP2010.phar');
$phar['cli.php'] = '<?php echo "Hello Forum PHP 2010 !n"; ?>';
$phar['web.php'] =
'<?php echo "<h1>Hello Forum PHP 2010 !</h1>"; ?>';
$phar->setDefaultStub('cli.php', 'web.php');
# identique à $phar->setStub($phar->createDefaultStub(
# 'cli.php', 'web/index.php'
# )
# );
?>
Les fichiers de démarrage par défaut
Feux de croisementFeux de croisement ►► CréationCréation
18
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.
Feux de croisementFeux de croisement ►► CréationCréation
19
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.
<?php
$phar = new Phar('helloForumPHP2010.phar');
$phar->setSignatureAlgorithm(phar::SHA1);
$phar->setStub('<?php $phar = new phar(__FILE__);
var_dump($pharData->getSignature());
include('phar://helloForumPHP2010.phar/index.php');
__HALT_COMPILER();'
);
?>
Feux de croisementFeux de croisement ►► CréationCréation
20
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.
Feux de croisementFeux de croisement
21
Plein PHAR !
<?php
include('phar://helloForumPHP2010.phar/index.php');
file_get_contents('phar://helloForumPHP2010.phar/index.php');
$phar = new phar('helloForumPHP2010.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);
?>
Feux de croisementFeux de croisement ►► UtilisationUtilisation
Exemples
22
Plein PHAR !
● Possible à l'aide de Phar::extractTo().
● Permet d'extraire la totalité ou seulement
certains fichiers d'une archive.
<?php
$phar = new phar('helloForumPHP2010.phar');
$phar->extractTo(__DIR__, array('index.php'), true);
?>
Feux de croisementFeux de croisement ►► UtilisationUtilisation
Extraction de fichiers
23
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 !
● Phar::(set|has|get|del)MetaData()
<?php
$phar = new Phar('helloForumPHP2010.phar');
$phar->setMetaData(array(
'country' => 'France',
'city' => 'Paris',
'location' => 'Cité des sciences & de l'industrie',
'creator' => 'AFUP',
'date' => date('d/m/Y h:i:s')
));
$phar->setStub('<?php $phar = new phar(__FILE__);
var_dump($pharData->getMetaData());
include('phar://helloForumPHP2010.phar/index.php');
__HALT_COMPILER();'
);
?>
Feux de routeFeux de route
Méta-données
25
Plein PHAR !
● PHAR non exécutable et
exécutable
● Formats disponibles :
– Phar::ZIP.
– Phar::TAR.
Compressions possibles :
Phar::NONE.
Phar::GZ (zlib).
Phar::BZ2 (bzip2).
.tar .zip
.tar.gz .zip
.tar.bz2 .zip
Phar::TAR Phar::ZIP
Phar::NONE
Phar::GZ
Phar::BZ2
Formats et compression
Feux de routeFeux de route
26
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().
<?php
$phar = new Phar('helloForumPHP2010.phar');
$pharData = $phar->convertToData(Phar::TAR);
var_dump($pharData->getStub();
$pharData = $phar->convertToData(Phar::TAR, Phar::GZ);
var_dump($pharData->getStub();
?>
Feux de routeFeux de route ►► Formats et compressionsFormats et compressions
27
Plein PHAR !
● 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().
<?php
$pharData = new PharData('helloForumPHP2010.tar');
$phar->convertToExecutable(Phar::PHAR, Phar::GZ);
$phar->createDefaultStub('cli.php', 'web.php');
?>
PHAR exécutable
Feux de routeFeux de route ►► Formats et compressionsFormats et compressions
28
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().
Feux de routeFeux de route ►► Formats et compressionsFormats et compressions
29
Plein PHAR !
Décompression
● Implicite lors d'une utilisation.
● Possible explicitement à l'aide des méthodes :
– Phar::decompress().
– PharData::decompress().
– Phar::decompressFiles().
– PharData::decompressFiles().
Feux de routeFeux de route ►► Formats et compressionsFormats et compressions
30
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.
<?php
$pharData = new PharData('helloForumPHP2010.tar');
$phar->setStub('<?php
Phar::mount(__DIR__ . "/config.php", "config.php");
require("config.php");
echo "Hello $who !n";
__HALT_COMPILER();'
);
?>
Feux de routeFeux de route
31
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.
Feux de routeFeux de route
32
Plein PHAR !
● Solution ?
– Créer effectivement le PHAR.
● Et si environnement de développement avec PHP < 5.3 ?
– Injection de dépendances
– Stub/Mock
Tests unitaires
Feux de routeFeux de route
33
Plein PHAR !
$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)
...
Exemple
Feux de routeFeux de route ►► Tests unitairesTests unitaires
34
Plein PHAR !
● 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 !
Performances
Feux de routeFeux de route
35
Plein PHAR !
Une preuve ?
# 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) !
# 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) !
Feux de routeFeux de route
36
Plein PHAR !
● 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>
Feux de routeFeux de route ►► Cas pratiqueCas pratique
Un cas pratique : Atoum
37
Plein PHAR !
● Dans le code
Feux de routeFeux de route ►► Cas pratiqueCas pratique
Atoum
<?php
require 'mageekguy.atoum.phar';
class boolean extends mageekguyatoumtest {
public function testTrue() {
$this->assert->boolean(true)->isTrue();
}
}
?>
38
Plein PHAR !
Références
● http://php.net/phar
● http://blog.pascal-martin.fr/post/php-5.3-phar-php-archive
39
Plein PHAR !
Questions ?
40
Plein PHAR !
Remerciements
● Merci à l'AFUP.
● Merci à PMSIpilot.
● Merci à vous.
frederic.hardy@mageekbox.net  http://blog.mageekbox.net  @mageekguy
Cette conférence est maintenant terminée, vous pouvez reprendre une activité normale.

Contenu connexe

Tendances

Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPjulien pauli
 
DNS sous linux
DNS sous linuxDNS sous linux
DNS sous linuxSouhaib El
 
Gestion des logs sur une plateforme web
Gestion des logs sur une plateforme webGestion des logs sur une plateforme web
Gestion des logs sur une plateforme webfredcons
 
AKT un outil pour sécuriser vos données et documents sensibles
AKT un outil pour sécuriser vos données et documents sensiblesAKT un outil pour sécuriser vos données et documents sensibles
AKT un outil pour sécuriser vos données et documents sensiblesStephane Carrez
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015Stéphane Legrand
 
Administration de plusieurs sites TYPO3
Administration de plusieurs sites TYPO3Administration de plusieurs sites TYPO3
Administration de plusieurs sites TYPO3Yannick Pavard
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en gokader15
 
Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Frank Denis
 
les Commandes linux/Unix (giants networks)
les Commandes linux/Unix (giants networks)les Commandes linux/Unix (giants networks)
les Commandes linux/Unix (giants networks)Souhaib El
 

Tendances (15)

Bash bonnes pratiques
Bash bonnes pratiquesBash bonnes pratiques
Bash bonnes pratiques
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHP
 
DNS sous linux
DNS sous linuxDNS sous linux
DNS sous linux
 
Rar
RarRar
Rar
 
Implementing a key/value store
Implementing a key/value storeImplementing a key/value store
Implementing a key/value store
 
Linux 101 slides-fr
Linux 101 slides-frLinux 101 slides-fr
Linux 101 slides-fr
 
Etes vous-pret pour php8 ?
Etes vous-pret pour php8 ?Etes vous-pret pour php8 ?
Etes vous-pret pour php8 ?
 
Configuration rnis
Configuration rnisConfiguration rnis
Configuration rnis
 
Gestion des logs sur une plateforme web
Gestion des logs sur une plateforme webGestion des logs sur une plateforme web
Gestion des logs sur une plateforme web
 
AKT un outil pour sécuriser vos données et documents sensibles
AKT un outil pour sécuriser vos données et documents sensiblesAKT un outil pour sécuriser vos données et documents sensibles
AKT un outil pour sécuriser vos données et documents sensibles
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015
 
Administration de plusieurs sites TYPO3
Administration de plusieurs sites TYPO3Administration de plusieurs sites TYPO3
Administration de plusieurs sites TYPO3
 
Pratique de la programmation en go
Pratique de la programmation en goPratique de la programmation en go
Pratique de la programmation en go
 
Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2) Redis - (nosqlfr meetup #2)
Redis - (nosqlfr meetup #2)
 
les Commandes linux/Unix (giants networks)
les Commandes linux/Unix (giants networks)les Commandes linux/Unix (giants networks)
les Commandes linux/Unix (giants networks)
 

En vedette

CSW Fourth Grade
CSW Fourth GradeCSW Fourth Grade
CSW Fourth Gradedcomins
 
Human Brain Ventral View
Human Brain Ventral ViewHuman Brain Ventral View
Human Brain Ventral ViewDr. IRSHAD A
 
использование интернета в маркетинге
использование интернета в маркетингеиспользование интернета в маркетинге
использование интернета в маркетингеBGalina
 
Unit 7. The Earth's crust
Unit 7. The Earth's crustUnit 7. The Earth's crust
Unit 7. The Earth's crustMónica
 
Atelier i15 - LA SÉMANTIQUE DANS MA STRATÉGIE DE RÉFÉRENCEMENT NATUREL
Atelier i15 - LA SÉMANTIQUE DANS MA STRATÉGIE DE RÉFÉRENCEMENT NATURELAtelier i15 - LA SÉMANTIQUE DANS MA STRATÉGIE DE RÉFÉRENCEMENT NATUREL
Atelier i15 - LA SÉMANTIQUE DANS MA STRATÉGIE DE RÉFÉRENCEMENT NATURELSalon e-tourisme #VeM
 

En vedette (8)

CSW Fourth Grade
CSW Fourth GradeCSW Fourth Grade
CSW Fourth Grade
 
Human Brain Ventral View
Human Brain Ventral ViewHuman Brain Ventral View
Human Brain Ventral View
 
Le Webshow netvibes 10 octobre 2012
Le Webshow netvibes 10 octobre 2012Le Webshow netvibes 10 octobre 2012
Le Webshow netvibes 10 octobre 2012
 
использование интернета в маркетинге
использование интернета в маркетингеиспользование интернета в маркетинге
использование интернета в маркетинге
 
Unit 7. The Earth's crust
Unit 7. The Earth's crustUnit 7. The Earth's crust
Unit 7. The Earth's crust
 
Extraits enquête Agrinautes 2009
Extraits enquête Agrinautes 2009Extraits enquête Agrinautes 2009
Extraits enquête Agrinautes 2009
 
Atelier i15 - LA SÉMANTIQUE DANS MA STRATÉGIE DE RÉFÉRENCEMENT NATUREL
Atelier i15 - LA SÉMANTIQUE DANS MA STRATÉGIE DE RÉFÉRENCEMENT NATURELAtelier i15 - LA SÉMANTIQUE DANS MA STRATÉGIE DE RÉFÉRENCEMENT NATUREL
Atelier i15 - LA SÉMANTIQUE DANS MA STRATÉGIE DE RÉFÉRENCEMENT NATUREL
 
Collect dev
Collect devCollect dev
Collect dev
 

Similaire à Plein phar

Apache server configuration & sécurisation -
Apache server configuration & sécurisation  -Apache server configuration & sécurisation  -
Apache server configuration & sécurisation -achraf_ing
 
20170706 Terraform, Rancher et AWS EFS
20170706 Terraform, Rancher et AWS EFS20170706 Terraform, Rancher et AWS EFS
20170706 Terraform, Rancher et AWS EFSAlexis Ducastel
 
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
 
[FR] Les requêtes HTTP de l'extrême
[FR] Les requêtes HTTP de l'extrême[FR] Les requêtes HTTP de l'extrême
[FR] Les requêtes HTTP de l'extrêmeOVHcloud
 
[Paris merge world tour] 4D Autour de Perforce 2013
[Paris   merge world tour] 4D Autour de Perforce 2013[Paris   merge world tour] 4D Autour de Perforce 2013
[Paris merge world tour] 4D Autour de Perforce 2013Perforce
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP NextSQLI
 
PHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_ExtensionsPHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_Extensionsjulien pauli
 
Kit de survie pour l'IoT façon DIY
Kit de survie pour l'IoT façon DIYKit de survie pour l'IoT façon DIY
Kit de survie pour l'IoT façon DIYlaurenthuet
 
Install oracle 11g sous RedHat
Install oracle 11g sous RedHatInstall oracle 11g sous RedHat
Install oracle 11g sous RedHatTaoufik AIT HSAIN
 
Présentation_Spark.pptx
Présentation_Spark.pptxPrésentation_Spark.pptx
Présentation_Spark.pptxboulonvert
 
Suivi qualité avec sonar pour php
Suivi qualité avec sonar pour phpSuivi qualité avec sonar pour php
Suivi qualité avec sonar pour phpGabriele Santini
 
Apache for développeurs PHP
Apache for développeurs PHPApache for développeurs PHP
Apache for développeurs PHPjulien pauli
 
Laravel yet another framework
Laravel  yet another frameworkLaravel  yet another framework
Laravel yet another frameworkLAHAXE Arnaud
 
Installation joomla15
Installation joomla15Installation joomla15
Installation joomla15Becem Ghalleb
 
PostgreSQL sous linux
PostgreSQL sous linuxPostgreSQL sous linux
PostgreSQL sous linuxKhalid ALLILI
 

Similaire à Plein phar (20)

PHP5 et les fichiers
PHP5 et les fichiersPHP5 et les fichiers
PHP5 et les fichiers
 
@Readme code s-sources-fr
@Readme code s-sources-fr@Readme code s-sources-fr
@Readme code s-sources-fr
 
Apache server configuration & sécurisation -
Apache server configuration & sécurisation  -Apache server configuration & sécurisation  -
Apache server configuration & sécurisation -
 
20170706 Terraform, Rancher et AWS EFS
20170706 Terraform, Rancher et AWS EFS20170706 Terraform, Rancher et AWS EFS
20170706 Terraform, Rancher et AWS EFS
 
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
 
Installation Joomla15 18 08 08
Installation Joomla15 18 08 08Installation Joomla15 18 08 08
Installation Joomla15 18 08 08
 
[FR] Les requêtes HTTP de l'extrême
[FR] Les requêtes HTTP de l'extrême[FR] Les requêtes HTTP de l'extrême
[FR] Les requêtes HTTP de l'extrême
 
[Paris merge world tour] 4D Autour de Perforce 2013
[Paris   merge world tour] 4D Autour de Perforce 2013[Paris   merge world tour] 4D Autour de Perforce 2013
[Paris merge world tour] 4D Autour de Perforce 2013
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP Next
 
PHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_ExtensionsPHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_Extensions
 
Kit de survie pour l'IoT façon DIY
Kit de survie pour l'IoT façon DIYKit de survie pour l'IoT façon DIY
Kit de survie pour l'IoT façon DIY
 
Apache Open SSL
Apache Open SSLApache Open SSL
Apache Open SSL
 
Install oracle 11g sous RedHat
Install oracle 11g sous RedHatInstall oracle 11g sous RedHat
Install oracle 11g sous RedHat
 
Présentation_Spark.pptx
Présentation_Spark.pptxPrésentation_Spark.pptx
Présentation_Spark.pptx
 
Suivi qualité avec sonar pour php
Suivi qualité avec sonar pour phpSuivi qualité avec sonar pour php
Suivi qualité avec sonar pour php
 
Apache for développeurs PHP
Apache for développeurs PHPApache for développeurs PHP
Apache for développeurs PHP
 
Laravel yet another framework
Laravel  yet another frameworkLaravel  yet another framework
Laravel yet another framework
 
Le client FTP de PHP5
Le client FTP de PHP5Le client FTP de PHP5
Le client FTP de PHP5
 
Installation joomla15
Installation joomla15Installation joomla15
Installation joomla15
 
PostgreSQL sous linux
PostgreSQL sous linuxPostgreSQL sous linux
PostgreSQL sous linux
 

Plus de Frederic Hardy

Comment tester des services web ?
Comment tester des services web ?Comment tester des services web ?
Comment tester des services web ?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
 
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
 
VIM puissance PHP = VI Improved !
VIM puissance PHP = VI Improved !VIM puissance PHP = VI Improved !
VIM puissance PHP = VI Improved !Frederic Hardy
 

Plus de Frederic Hardy (10)

Comment tester des services web ?
Comment tester des services web ?Comment tester des services web ?
Comment tester des services web ?
 
TDD avec atoum
TDD avec atoumTDD avec atoum
TDD avec atoum
 
TDD avec atoum
TDD avec atoumTDD avec atoum
TDD avec atoum
 
Anatomie du test
Anatomie du testAnatomie du test
Anatomie du test
 
Atoum
AtoumAtoum
Atoum
 
Plein PHAR !
Plein PHAR !Plein PHAR !
Plein PHAR !
 
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...
 
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 !
 
VIM puissance PHP = VI Improved !
VIM puissance PHP = VI Improved !VIM puissance PHP = VI Improved !
VIM puissance PHP = VI Improved !
 

Plein phar

  • 1. Plein PHAR ! Forum PHP 2010Forum PHP 2010 9 et 10 novembre9 et 10 novembre ParisParis cité des sciences et de l'industriecité des sciences et de l'industrie Frédéric Hardy frederic.hardy@mageekbox.net http://blog.mageekbox.net @mageekguy Les scripts utilisés pour cette conférence sont disponibles à l'adresse http://medias.mageekbox.net/conferences/forumPHP2010/
  • 2. Plein PHAR ! Préambule # php forumPHP2010.phar –e suhosin.executor.include.whitelist="phar"
  • 3. 3 Plein PHAR ! Plan 1. Feux de position 2. Feux de croisement 3. Feux de route
  • 4. 4 Plein PHAR ! Feu de position 1.Description 2.Historique 3.Installation
  • 5. 5 Plein PHAR ! ● 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. Description Feux de positionFeux de position
  • 6. 6 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. Feux de positionFeux de position
  • 7. 7 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. Feux de positionFeux de position ►► InstallationInstallation
  • 8. 8 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 Feux de positionFeux de position ►► InstallationInstallation
  • 9. 9 Plein PHAR ! Feu de croisement 1.Fonctionnement 2.Compatibilité 3.Structure 4.Création 5.Utilisation 6.Modification
  • 10. 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. Feux de croisementFeux de croisement
  • 11. 11 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. Feux de croisementFeux de croisement
  • 12. 12 Plein PHAR ! 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. Structure Feux de croisementFeux de croisement
  • 13. 13 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. Feux de croisementFeux de croisement ►► StructureStructure
  • 14. 14 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. Feux de croisementFeux de croisement
  • 15. 15 Plein PHAR ! Script <?php $phar = new Phar('helloForumPHP2010.phar'); $phar['index.php'] = '<?php echo "Hello Forum PHP 2010 !n"; ?>' ; $phar->createDefaultStub(); ?> Feux de croisementFeux de croisement ►► CréationCréation # php -d phar.readonly 001-helloForumPHP2010.php # php helloForumPHP2010.phar
  • 16. 16 Plein PHAR ! ● 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(). <?php $phar = new Phar('helloworld.phar'); var_dump($phar->getStub()); ?> Feux de croisementFeux de croisement ►► CréationCréation Définition du fichier de démarrage
  • 17. 17 Plein PHAR ! ● Intégrable via : – Phar::createDefaultStub() – Phar::setDefaultStub() et Phar::setStub(). ● Utilisable en ligne de commande et sur le Web. <?php $phar = new Phar('helloForumPHP2010.phar'); $phar['cli.php'] = '<?php echo "Hello Forum PHP 2010 !n"; ?>'; $phar['web.php'] = '<?php echo "<h1>Hello Forum PHP 2010 !</h1>"; ?>'; $phar->setDefaultStub('cli.php', 'web.php'); # identique à $phar->setStub($phar->createDefaultStub( # 'cli.php', 'web/index.php' # ) # ); ?> Les fichiers de démarrage par défaut Feux de croisementFeux de croisement ►► CréationCréation
  • 18. 18 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. Feux de croisementFeux de croisement ►► CréationCréation
  • 19. 19 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. <?php $phar = new Phar('helloForumPHP2010.phar'); $phar->setSignatureAlgorithm(phar::SHA1); $phar->setStub('<?php $phar = new phar(__FILE__); var_dump($pharData->getSignature()); include('phar://helloForumPHP2010.phar/index.php'); __HALT_COMPILER();' ); ?> Feux de croisementFeux de croisement ►► CréationCréation
  • 20. 20 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. Feux de croisementFeux de croisement
  • 21. 21 Plein PHAR ! <?php include('phar://helloForumPHP2010.phar/index.php'); file_get_contents('phar://helloForumPHP2010.phar/index.php'); $phar = new phar('helloForumPHP2010.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); ?> Feux de croisementFeux de croisement ►► UtilisationUtilisation Exemples
  • 22. 22 Plein PHAR ! ● Possible à l'aide de Phar::extractTo(). ● Permet d'extraire la totalité ou seulement certains fichiers d'une archive. <?php $phar = new phar('helloForumPHP2010.phar'); $phar->extractTo(__DIR__, array('index.php'), true); ?> Feux de croisementFeux de croisement ►► UtilisationUtilisation Extraction de fichiers
  • 23. 23 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. 24 Plein PHAR ! ● Phar::(set|has|get|del)MetaData() <?php $phar = new Phar('helloForumPHP2010.phar'); $phar->setMetaData(array( 'country' => 'France', 'city' => 'Paris', 'location' => 'Cité des sciences & de l'industrie', 'creator' => 'AFUP', 'date' => date('d/m/Y h:i:s') )); $phar->setStub('<?php $phar = new phar(__FILE__); var_dump($pharData->getMetaData()); include('phar://helloForumPHP2010.phar/index.php'); __HALT_COMPILER();' ); ?> Feux de routeFeux de route Méta-données
  • 25. 25 Plein PHAR ! ● PHAR non exécutable et exécutable ● Formats disponibles : – Phar::ZIP. – Phar::TAR. Compressions possibles : Phar::NONE. Phar::GZ (zlib). Phar::BZ2 (bzip2). .tar .zip .tar.gz .zip .tar.bz2 .zip Phar::TAR Phar::ZIP Phar::NONE Phar::GZ Phar::BZ2 Formats et compression Feux de routeFeux de route
  • 26. 26 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(). <?php $phar = new Phar('helloForumPHP2010.phar'); $pharData = $phar->convertToData(Phar::TAR); var_dump($pharData->getStub(); $pharData = $phar->convertToData(Phar::TAR, Phar::GZ); var_dump($pharData->getStub(); ?> Feux de routeFeux de route ►► Formats et compressionsFormats et compressions
  • 27. 27 Plein PHAR ! ● 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(). <?php $pharData = new PharData('helloForumPHP2010.tar'); $phar->convertToExecutable(Phar::PHAR, Phar::GZ); $phar->createDefaultStub('cli.php', 'web.php'); ?> PHAR exécutable Feux de routeFeux de route ►► Formats et compressionsFormats et compressions
  • 28. 28 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(). Feux de routeFeux de route ►► Formats et compressionsFormats et compressions
  • 29. 29 Plein PHAR ! Décompression ● Implicite lors d'une utilisation. ● Possible explicitement à l'aide des méthodes : – Phar::decompress(). – PharData::decompress(). – Phar::decompressFiles(). – PharData::decompressFiles(). Feux de routeFeux de route ►► Formats et compressionsFormats et compressions
  • 30. 30 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. <?php $pharData = new PharData('helloForumPHP2010.tar'); $phar->setStub('<?php Phar::mount(__DIR__ . "/config.php", "config.php"); require("config.php"); echo "Hello $who !n"; __HALT_COMPILER();' ); ?> Feux de routeFeux de route
  • 31. 31 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. Feux de routeFeux de route
  • 32. 32 Plein PHAR ! ● Solution ? – Créer effectivement le PHAR. ● Et si environnement de développement avec PHP < 5.3 ? – Injection de dépendances – Stub/Mock Tests unitaires Feux de routeFeux de route
  • 33. 33 Plein PHAR ! $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) ... Exemple Feux de routeFeux de route ►► Tests unitairesTests unitaires
  • 34. 34 Plein PHAR ! ● 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 ! Performances Feux de routeFeux de route
  • 35. 35 Plein PHAR ! Une preuve ? # 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) ! # 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) ! Feux de routeFeux de route
  • 36. 36 Plein PHAR ! ● 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> Feux de routeFeux de route ►► Cas pratiqueCas pratique Un cas pratique : Atoum
  • 37. 37 Plein PHAR ! ● Dans le code Feux de routeFeux de route ►► Cas pratiqueCas pratique Atoum <?php require 'mageekguy.atoum.phar'; class boolean extends mageekguyatoumtest { public function testTrue() { $this->assert->boolean(true)->isTrue(); } } ?>
  • 38. 38 Plein PHAR ! Références ● http://php.net/phar ● http://blog.pascal-martin.fr/post/php-5.3-phar-php-archive
  • 40. 40 Plein PHAR ! Remerciements ● Merci à l'AFUP. ● Merci à PMSIpilot. ● Merci à vous. frederic.hardy@mageekbox.net http://blog.mageekbox.net @mageekguy Cette conférence est maintenant terminée, vous pouvez reprendre une activité normale.