<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/phar.using.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'phar.using.intro.php',
    1 => 'Utiliser les archives Phar : Introduction',
    2 => 'Utiliser les archives Phar : Introduction',
  ),
  'up' => 
  array (
    0 => 'phar.using.php',
    1 => 'Utiliser les archives Phar',
  ),
  'prev' => 
  array (
    0 => 'phar.using.php',
    1 => 'Utiliser les archives Phar',
  ),
  'next' => 
  array (
    0 => 'phar.using.stream.php',
    1 => 'Utiliser les archives Phar : le flux phar',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'reference/phar/using.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="phar.using.intro" class="section">
 <h2 class="title">Utiliser les archives Phar : Introduction</h2>
 <p class="para">
  Les archives Phar sont identiques dans le concept aux archives JAR
  de Java, mais sont conçues plus spécifiquement pour les besoins et
  la flexibilité des applications PHP. Une archive Phar est utilisée
  pour distribuer une application PHP complète ou une bibliothèque 
  sous forme d&#039;un fichier unique.
  Une application sous forme d&#039;archive Phar est utilisée exactement de 
  la même façon que n&#039;importe quelle autre application PHP :
 </p>
 <div class="example-contents screen">
  <div class="cdata"><pre>
php applicationsympa.phar
  </pre></div>
 </div>
 <p class="para">
  L&#039;utilisation d&#039;une bibliothèque sous forme d&#039;archive Phar est la
  même que n&#039;importe quelle autre bibliothèque PHP :
 </p>
 <p class="para">
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">include </span><span style="color: #DD0000">'bibliothequesympa.phar'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  Le flux <code class="literal">phar</code> fournit le cœur de l&#039;extension phar, et
  est décrit en détails <a href="phar.using.stream.php" class="link">ici</a>.
  Le flux phar permet l&#039;accès aux fichiers contenus dans une archive phar via les
  fonctions standards de fichier <span class="function"><a href="function.fopen.php" class="function">fopen()</a></span>, <span class="function"><a href="function.opendir.php" class="function">opendir()</a></span>, et
  toute autre fonctionnant sur des fichiers normaux. Le flux <code class="literal">phar</code> supporte toutes
  les opérations de lecture/écriture à la fois sur les fichiers et sur les répertoires.
 </p>
 <p class="para">
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">include </span><span style="color: #DD0000">'phar://bibliothequesympa.phar/fichier/interne.php'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">'Content-type: image/jpeg'</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// les phars peuvent être atteint via le chemin complet ou via des alias<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">'phar:///chemin/complet/vers/bibliothequesympa.phar/images/wow.jpg'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  La classe <span class="classname"><a href="class.phar.php" class="classname">Phar</a></span> implémente des fonctionnalités
  avancées pour accéder aux fichiers et créer des archives phar. La 
  classe Phar est décrite en détails <a href="phar.using.object.php" class="link">ici</a>.
 </p>
 <p class="para">
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">try {<br />    </span><span style="color: #FF8000">// ouvre un phar existant<br />    </span><span style="color: #0000BB">$p </span><span style="color: #007700">= new </span><span style="color: #0000BB">Phar</span><span style="color: #007700">(</span><span style="color: #DD0000">'bibliothequesympa.phar'</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">);<br />    </span><span style="color: #FF8000">// Phar étend la classe DirectoryIterator de SPL<br />    </span><span style="color: #007700">foreach (new </span><span style="color: #0000BB">RecursiveIteratorIterator</span><span style="color: #007700">(</span><span style="color: #0000BB">$p</span><span style="color: #007700">) as </span><span style="color: #0000BB">$file</span><span style="color: #007700">) {<br />        </span><span style="color: #FF8000">// $file est une classe PharFileInfo et hérité de SplFileInfo<br />        </span><span style="color: #007700">echo </span><span style="color: #0000BB">$file</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getFileName</span><span style="color: #007700">() . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />        echo </span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #0000BB">$file</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getPathName</span><span style="color: #007700">()) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">; </span><span style="color: #FF8000">// affiche le contenu;<br />    </span><span style="color: #007700">}<br />    if (isset(</span><span style="color: #0000BB">$p</span><span style="color: #007700">[</span><span style="color: #DD0000">'fichier/interne.php'</span><span style="color: #007700">])) {<br />        </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$p</span><span style="color: #007700">[</span><span style="color: #DD0000">'fichier/interne.php'</span><span style="color: #007700">]-&gt;</span><span style="color: #0000BB">getMetadata</span><span style="color: #007700">());<br />    }<br /><br />    </span><span style="color: #FF8000">// crée un nouveau phar - phar.readonly doit être à 0 dans php.ini<br />    // phar.readonly est activé par défaut pour des raisons de sécurité.<br />    // Sur des serveurs de production, les Phars n'ont pas besoin d'être créés,<br />    // juste d'être exécutés.<br />    </span><span style="color: #007700">if (</span><span style="color: #0000BB">Phar</span><span style="color: #007700">::</span><span style="color: #0000BB">canWrite</span><span style="color: #007700">()) {<br />        </span><span style="color: #0000BB">$p </span><span style="color: #007700">= new </span><span style="color: #0000BB">Phar</span><span style="color: #007700">(</span><span style="color: #DD0000">'nouveauphar.tar.phar'</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #DD0000">'nouveauphar.tar.phar'</span><span style="color: #007700">);<br />        </span><span style="color: #FF8000">// On crée une archive Phar basée sur tar, compressée par gzip (.tar.gz)<br />        </span><span style="color: #0000BB">$p </span><span style="color: #007700">= </span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">convertToExecutable</span><span style="color: #007700">(</span><span style="color: #0000BB">Phar</span><span style="color: #007700">::</span><span style="color: #0000BB">TAR</span><span style="color: #007700">, </span><span style="color: #0000BB">Phar</span><span style="color: #007700">::</span><span style="color: #0000BB">GZ</span><span style="color: #007700">);<br /><br />        </span><span style="color: #FF8000">// crée une transaction - rien n'est écrit dans nouveauphar.phar<br />        // jusqu'à ce que stopBuffering() ne soit appelé, bien qu'un stockage temporaire soit requis<br />        </span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">startBuffering</span><span style="color: #007700">();<br />        </span><span style="color: #FF8000">// ajoute tous les fichiers de /chemin/vers/leprojet dans le phar avec le préfixe "projet"<br />        </span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">buildFromIterator</span><span style="color: #007700">(new </span><span style="color: #0000BB">RecursiveIteratorIterator</span><span style="color: #007700">(new </span><span style="color: #0000BB">RecursiveDirectoryIterator</span><span style="color: #007700">(</span><span style="color: #DD0000">'/chemin/vers/leprojet'</span><span style="color: #007700">)), </span><span style="color: #DD0000">'/chemin/vers/'</span><span style="color: #007700">);<br /><br />        </span><span style="color: #FF8000">// ajoute un nouveau fichier en utilisant l'API d'accès par tableau<br />        </span><span style="color: #0000BB">$p</span><span style="color: #007700">[</span><span style="color: #DD0000">'fichier1.txt'</span><span style="color: #007700">] = </span><span style="color: #DD0000">'Information'</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$fp </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">'grosfichier.dat'</span><span style="color: #007700">, </span><span style="color: #DD0000">'rb'</span><span style="color: #007700">);<br />        </span><span style="color: #FF8000">// copie toutes les données du flux<br />        </span><span style="color: #0000BB">$p</span><span style="color: #007700">[</span><span style="color: #DD0000">'data/grosfichier.dat'</span><span style="color: #007700">] = </span><span style="color: #0000BB">$fp</span><span style="color: #007700">;<br /><br />        if (</span><span style="color: #0000BB">Phar</span><span style="color: #007700">::</span><span style="color: #0000BB">canCompress</span><span style="color: #007700">(</span><span style="color: #0000BB">Phar</span><span style="color: #007700">::</span><span style="color: #0000BB">GZ</span><span style="color: #007700">)) {<br />            </span><span style="color: #0000BB">$p</span><span style="color: #007700">[</span><span style="color: #DD0000">'data/grosfichier.dat'</span><span style="color: #007700">]-&gt;</span><span style="color: #0000BB">compress</span><span style="color: #007700">(</span><span style="color: #0000BB">Phar</span><span style="color: #007700">::</span><span style="color: #0000BB">GZ</span><span style="color: #007700">);<br />        }<br /><br />        </span><span style="color: #0000BB">$p</span><span style="color: #007700">[</span><span style="color: #DD0000">'images/wow.jpg'</span><span style="color: #007700">] = </span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">'images/wow.jpg'</span><span style="color: #007700">);<br />        </span><span style="color: #FF8000">// toute valeur peut être sauvegardée comme métadonnée spécifique au fichier<br />        </span><span style="color: #0000BB">$p</span><span style="color: #007700">[</span><span style="color: #DD0000">'images/wow.jpg'</span><span style="color: #007700">]-&gt;</span><span style="color: #0000BB">setMetadata</span><span style="color: #007700">(array(</span><span style="color: #DD0000">'mime-type' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'image/jpeg'</span><span style="color: #007700">));<br />        </span><span style="color: #0000BB">$p</span><span style="color: #007700">[</span><span style="color: #DD0000">'index.php'</span><span style="color: #007700">] = </span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">'index.php'</span><span style="color: #007700">);<br />        </span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setMetadata</span><span style="color: #007700">(array(</span><span style="color: #DD0000">'bootstrap' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'index.php'</span><span style="color: #007700">));<br /><br />        </span><span style="color: #FF8000">// sauvegarde l'archive phar sur le disque<br />        </span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">stopBuffering</span><span style="color: #007700">();<br />    }<br />} catch (</span><span style="color: #0000BB">Exception $e</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">'N\'a pas pu ouvrir le Phar: '</span><span style="color: #007700">, </span><span style="color: #0000BB">$e</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  D&#039;autre part, la vérification du contenu du fichier phar peut être faite en utilisant un des
  algorithme de signature symétrique (MD5, SHA1, SHA256 et SHA512 si ext/hash est activée) et
  en utilisant la signature asymétrique par clé publique/privée d&#039;OpenSSL.
  Pour tirer parti de la signature OpenSSL, il faut générer une paire de clés publique/privée et
  utiliser la clé privée pour signer avec <span class="function"><a href="phar.setsignaturealgorithm.php" class="function">Phar::setSignatureAlgorithm()</a></span>. En plus, la
  clé publique, extraite en utilisant ce code :
  <div class="example-contents">
   <div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$public </span><span style="color: #007700">= </span><span style="color: #0000BB">openssl_get_publickey</span><span style="color: #007700">(</span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">'private.pem'</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$pkey </span><span style="color: #007700">= </span><span style="color: #DD0000">''</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">openssl_pkey_export</span><span style="color: #007700">(</span><span style="color: #0000BB">$public</span><span style="color: #007700">, </span><span style="color: #0000BB">$pkey</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

  doit être sauvegardée à part de l&#039;archive phar qu&#039;elle vérifie. Si l&#039;archive phar est sauvegardée
  en tant que <code class="literal">/chemin/vers/mon.phar</code>, la clé publique doit être sauvegardée en tant
  que <code class="literal">/chemin/vers/mon.phar.pubkey</code>, sans quoi phar ne sera pas capable de vérifier
  la signature OpenSSL.
 </p>
 <p class="para">
  La classe <span class="classname"><a href="class.phar.php" class="classname">Phar</a></span> fournit aussi trois méthodes statiques, <span class="function"><a href="phar.webphar.php" class="function">Phar::webPhar()</a></span>,
  <span class="function"><a href="phar.mungserver.php" class="function">Phar::mungServer()</a></span> et <span class="function"><a href="phar.interceptfilefuncs.php" class="function">Phar::interceptFileFuncs()</a></span> qui sont cruciales
  pour empaqueter des applications PHP visant à être utilisée sur un système de fichiers classique ou en tant qu&#039;application web.
  <span class="function"><a href="phar.webphar.php" class="function">Phar::webPhar()</a></span> implémente un contrôleur qui route les appels HTTP vers le bon endroit de l&#039;archive phar.
  <span class="function"><a href="phar.mungserver.php" class="function">Phar::mungServer()</a></span> est utilisé pour modifier les valeurs du tableau <var class="varname"><a href="reserved.variables.server.php" class="classname">$_SERVER</a></var> pour
  dire aux applications d&#039;utiliser ces valeurs. <span class="function"><a href="phar.interceptfilefuncs.php" class="function">Phar::interceptFileFuncs()</a></span> dit à Phar d&#039;intercepter les appels à
  <span class="function"><a href="function.fopen.php" class="function">fopen()</a></span>, <span class="function"><a href="function.file-get-contents.php" class="function">file_get_contents()</a></span>, <span class="function"><a href="function.opendir.php" class="function">opendir()</a></span>, et
  à toutes les fonctions basées sur stat (<span class="function"><a href="function.file-exists.php" class="function">file_exists()</a></span>, <span class="function"><a href="function.is-readable.php" class="function">is_readable()</a></span>, etc) et
  route tous les chemins relatif vers les bons endroits de l&#039;archive phar.
 </p>
 <p class="para">
  Par exemple, empaqueter une version de la célèbre application phpMyAdmin dans une archive phar nécessite
  juste ce simple script et, dès lors, <code class="literal">phpMyAdmin.phar.tar.php</code> peut être accédé comme un fichier
  classique à partir du serveur web, après avoir modifié le couple utilisateur/motdepasse :
 </p>
 <p class="para">
  <div class="informalexample">
   <div class="example-contents">
    <div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">@</span><span style="color: #0000BB">unlink</span><span style="color: #007700">(</span><span style="color: #DD0000">'phpMyAdmin.phar.tar.php'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">copy</span><span style="color: #007700">(</span><span style="color: #DD0000">'phpMyAdmin-2.11.3-english.tar.gz'</span><span style="color: #007700">, </span><span style="color: #DD0000">'phpMyAdmin.phar.tar.php'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= new </span><span style="color: #0000BB">Phar</span><span style="color: #007700">(</span><span style="color: #DD0000">'phpMyAdmin.phar.tar.php'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">startBuffering</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">[</span><span style="color: #DD0000">"phpMyAdmin-2.11.3-english/config.inc.php"</span><span style="color: #007700">] = </span><span style="color: #DD0000">'&lt;?php<br />/* Servers configuration */<br />$i = 0;<br /><br />/* Server localhost (config:root) [1] */<br />$i++;<br />$cfg[\'Servers\'][$i][\'host\'] = \'localhost\';<br />$cfg[\'Servers\'][$i][\'extension\'] = \'mysqli\';<br />$cfg[\'Servers\'][$i][\'connect_type\'] = \'tcp\';<br />$cfg[\'Servers\'][$i][\'compress\'] = false;<br />$cfg[\'Servers\'][$i][\'auth_type\'] = \'config\';<br />$cfg[\'Servers\'][$i][\'user\'] = \'root\';<br />$cfg[\'Servers\'][$i][\'password\'] = \'\';<br /><br /><br />/* End of servers configuration */<br />if (strpos(PHP_OS, \'WIN\') !== false) {<br />    $cfg[\'UploadDir\'] = getcwd();<br />} else {<br />    $cfg[\'UploadDir\'] = \'/tmp/pharphpmyadmin\';<br />    @mkdir(\'/tmp/pharphpmyadmin\');<br />    @chmod(\'/tmp/pharphpmyadmin\', 0777);<br />}'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setStub</span><span style="color: #007700">(</span><span style="color: #DD0000">'&lt;?php<br />Phar::interceptFileFuncs();<br />Phar::webPhar("phpMyAdmin.phar", "phpMyAdmin-2.11.3-english/index.php");<br />echo "phpMyAdmin is intended to be executed from a web browser\n";<br />exit -1;<br />__HALT_COMPILER();<br />'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">stopBuffering</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
</div><?php manual_footer($setup); ?>