<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/features.commandline.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'features.commandline.usage.php',
    1 => 'Utilisation',
    2 => 'Ex&eacute;cution de fichiers PHP',
  ),
  'up' => 
  array (
    0 => 'features.commandline.php',
    1 => 'Utilisation des lignes de commande',
  ),
  'prev' => 
  array (
    0 => 'features.commandline.options.php',
    1 => 'Options',
  ),
  'next' => 
  array (
    0 => 'features.commandline.io-streams.php',
    1 => 'Flux I/O',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'features/commandline.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="features.commandline.usage" class="section">
  <h2 class="title">Exécution de fichiers PHP</h2>
  
  <p class="para">
   Il y a 3 façons différentes d&#039;appeler le <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> avec du code PHP
   à exécuter :
   <ol type="1">
    <li class="listitem">
     <p class="para">
      Indiquer à PHP d&#039;exécuter un fichier donné :
     </p>
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
php mon_script.php

php -f mon_script.php
</pre></div>
      </div>
     </div>
     <p class="para">
      Les deux méthodes (en utilisant <strong class="option unknown">-f</strong> ou pas) exécutent le
      script contenu dans le fichier <var class="filename">mon_script.php</var>.
      Notez qu&#039;il n&#039;existe pas de restriction sur les fichiers pouvant
      être exécutés ; en particulier, il n&#039;est pas nécessaire que l&#039;extension
      du fichier soit <code class="literal">.php</code>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Donner du code PHP à exécuter directement en ligne de commande.
     </p>
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
php -r &#039;print_r(get_defined_constants());&#039;
</pre></div>
      </div>
     </div>
     <p class="para">
      Une attention particulière doit alors être apportée aux variables d&#039;environnement,
      qui seront remplacées, et aux guillemets, qui ont des significations spéciales en
      ligne de commande.
     </p>
     <blockquote class="note"><p><strong class="note">Note</strong>: 
      <p class="para">
       Lire l&#039;exemple attentivement, il n&#039;y a ni balise d&#039;ouverture, ni balise de fermeture !
       L&#039;option <strong class="option unknown">-r</strong> rend caduque l&#039;utilisation de celles-ci, et les ajouter conduirait
       alors à une erreur d&#039;analyse syntaxique.
      </p>
     </p></blockquote>
    </li>
    <li class="listitem">
     <p class="para">
      Alimenter l&#039;entrée standard en code PHP
      (<code class="literal">stdin</code>).
     </p>
     <p class="para">
      Cela donne la possibilité de créer dynamiquement du code
      PHP, puis de le fournir à PHP, et enfin,
      de le traiter à nouveau en shell. Voici un exemple fictif :
     </p>
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
$ some_application | some_filter | php | sort -u &gt; final_output.txt
</pre></div>
      </div>
     </div>
    </li>
   </ol>
   Il n&#039;est pas possible de combiner ces trois modes d&#039;exécution.
  </p>
  
  <p class="para">
   Comme toute application shell, l&#039;exécutable PHP accepte
   des arguments ; cependant, le script PHP peut aussi en recevoir.
   Le nombre d&#039;arguments pouvant être passés au script n&#039;est pas limité par PHP
   (le shell a une limite en termes de nombre de caractères qui peuvent être passés.
   Généralement, cette limite ne sera pas atteinte). Les arguments passés au script seront
   transmis via la variable tableau <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv</a></var>. Le premier
   index (zéro) contient toujours le nom du script appelé depuis la ligne
   de commande. Il est à noter que, si le code est exécuté en ligne en utilisant
   l&#039;option de ligne de commande <strong class="option unknown">-r</strong>, la valeur de <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv[0]</a></var>
   sera <code class="literal">&quot;Standard input code&quot;</code>; antérieur à PHP 7.2.0,
   c&#039;était un tiret (<code class="literal">&quot;-&quot;</code>) à la place. Cela est aussi vrai si
   le code est exécuté via un pipe depuis <strong><code><a href="reserved.constants.php#constant.stdin">STDIN</a></code></strong>.
  </p>
  
  <p class="para">
   Une seconde variable globale, <var class="varname"><a href="reserved.variables.argc.php" class="classname">$argc</a></var>, contient le nombre
   d&#039;éléments du tableau <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv</a></var>
   (<strong>et non pas</strong> le nombre d&#039;arguments passés
   au script).
  </p>
  
  <p class="para">
   Tant que les arguments passés au script ne commencent pas par
   le caractère <code class="literal">-</code>, il n&#039;y a rien de spécial à surveiller.
   Le fait de passer des arguments au script qui commencent par
   <code class="literal">-</code> pose des problèmes car PHP
   va penser qu&#039;il doit les interpréter. Pour éviter cela, utiliser le séparateur
   <code class="literal">--</code>. Après cet argument, tous les arguments suivants seront
   passés au script sans être modifiés ou analysés par PHP.
  </p>
  <div class="informalexample">
   <div class="example-contents screen">
<div class="cdata"><pre>
# Cela ne va pas exécuter le code, mais afficher l&#039;aide de PHP
$ php -r &#039;var_dump($argv);&#039; -h
Usage: php [options] [-f] &lt;file&gt; [args...]
[...]

# Cela va passer l&#039;argument &#039;-h&#039; au script, et éviter que PHP ne le traite
$ php -r &#039;var_dump($argv);&#039; -- -h
array(2) {
  [0]=&gt;
  string(1) &quot;-&quot;
  [1]=&gt;
  string(2) &quot;-h&quot;
}
</pre></div>
   </div>
  </div>
  <p class="para">
   Cependant, il y a une autre méthode pour utiliser PHP en script shell ;
   la première ligne du script devra être <code class="literal">#!/usr/bin/php</code>
   (à remplacer par le chemin vers le binaire PHP <abbr title="Command Line Interpreter/Interface">CLI</abbr> sur le système sous-jacent).
   Le reste du fichier doit contenir le code PHP normal, compris entre les
   balises ouvrantes/fermantes. Après avoir mis les droits d&#039;exécution sur le
   script (<strong class="command">chmod +x test</strong>), il peut être exécuté comme un script
   shell ou perl habituel :
  </p>
  
  <div class="example" id="example-1">
   <p><strong>Exemple #1 Exécute un script PHP en tant que script shell</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">#!/usr/bin/php<br /><span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$argv</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>
    En supposant que ce fichier s&#039;appelle <var class="filename">test</var>, dans le
    dossier courant, il est alors possible de faire ceci :
   </p></div>
   <div class="example-contents screen">
<div class="cdata"><pre>
$ chmod +x test
$ ./test -h -- foo
array(4) {
   [0]=&gt;
   string(6) &quot;./test&quot;
   [1]=&gt;
   string(2) &quot;-h&quot;
   [2]=&gt;
   string(2) &quot;--&quot;
   [3]=&gt;
   string(3) &quot;foo&quot;
}
</pre></div>
   </div>
  </div>
  
  <p class="para">
   Comme on peut le voir, dans ce cas, il n&#039;est pas nécessaire
   de faire attention lors du passage de paramètres qui commencent par
   <code class="literal">-</code> au script.
  </p>
  
  <p class="para">
   L&#039;exécutable PHP peut être utilisé pour exécuter des scripts indépendants du
   serveur web. Sur un système Unix, il est recommandé d&#039;ajouter
   la ligne spéciale en début de script, de le rendre exécutable de
   manière que le système sache quel programme doit exécuter le script.
   Sous Windows, il est possible d&#039;associer l&#039;exécutable <var class="filename">php.exe</var>
   avec le double-clic sur les fichiers d&#039;extension <code class="literal">.php</code>,
   ou bien de faire un fichier batch pour exécuter le script grâce
   à PHP. La première ligne utilisée dans le monde Unix ne perturbera pas
   l&#039;exécution sous Windows, ce qui rend les scripts facilement portables. Un exemple
   complet est disponible ci-dessous :
  </p>
  <p class="para">
   <div class="example" id="example-2">
    <p><strong>Exemple #2 Script prévu pour être exécuté en ligne de commande (script.php)</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">#!/usr/bin/php<br /><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700">!= </span><span style="color: #0000BB">2 </span><span style="color: #007700">|| </span><span style="color: #0000BB">in_array</span><span style="color: #007700">(</span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">], array(</span><span style="color: #DD0000">'--help'</span><span style="color: #007700">, </span><span style="color: #DD0000">'-help'</span><span style="color: #007700">, </span><span style="color: #DD0000">'-h'</span><span style="color: #007700">, </span><span style="color: #DD0000">'-?'</span><span style="color: #007700">))) {<br /></span><span style="color: #0000BB">?&gt;<br /></span><br />C'est une ligne de commande à une option.<br /><br />  Utilisation :<br />  <span style="color: #0000BB">&lt;?php </span><span style="color: #007700">echo </span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]; </span><span style="color: #0000BB">?&gt;</span> &lt;option&gt;<br /><br />  &lt;option&gt; peut être un mot que vous souhaitez afficher.<br />  Avec les options --help, -help, -h,<br />  et -?, vous obtiendrez cette aide.<br /><br /><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">} else {<br />    echo </span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">];<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
  
  <p class="para">
   Le script ci-dessus inclut la première ligne spéciale indiquant que ce fichier
   doit être exécuté par PHP. Nous travaillons ici avec la version <abbr title="Command Line Interpreter/Interface">CLI</abbr>, aussi,
   aucun en-tête <abbr title="Hypertext Transfer Protocol">HTTP</abbr> ne sera affiché.
  </p>
  
  <p class="para">
   Le programme commence par vérifier que l&#039;argument requis est spécifié
   (en plus du nom du script, qui est aussi compté). S&#039;il n&#039;est pas présent,
   ou si l&#039;argument est <strong class="option unknown">--help</strong>, <strong class="option unknown">-help</strong>,
   <strong class="option unknown">-h</strong> ou <strong class="option unknown">-?</strong>, un message d&#039;aide sera affiché,
   en utilisant <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv[0]</a></var> pour afficher dynamiquement le nom
   du script tel qu&#039;entré dans la ligne de commande. Sinon, l&#039;argument est affiché
   tel qu&#039;il a été entré dans le terminal.
  </p>
  
  <p class="para">
   Pour exécuter le script ci-dessus sous Unix, il faut le rendre
   exécutable, puis l&#039;appeler avec une commande comme :
   <strong class="command">script.php echothis</strong> ou
   <strong class="command">script.php -h</strong>. Sous Windows, il est possible de faire un
   fichier batch pour cela :
  </p>
  
  <p class="para">
   <div class="example" id="example-3">
    <p><strong>Exemple #3 Fichier batch pour exécuter un script PHP en ligne de commande (script.bat)</strong></p>
    <div class="example-contents">
<div class="winbatcode"><pre class="winbatcode">@echo OFF
&quot;C:\php\php.exe&quot; script.php %*</pre>
</div>
    </div>

   </div>
  </p>
  
  <p class="para">
   En supposant que le programme ci-dessus est nommé
   <var class="filename">script.php</var>, et que l&#039;exécutable <abbr title="Command Line Interpreter/Interface">CLI</abbr>
   <var class="filename">php.exe</var> se trouve dans
   <var class="filename">C:\php\php.exe</var>, ce fichier batch l&#039;exécutera
   avec les options qui lui sont passées :
   <strong class="command">script.bat echothis</strong> ou
   <strong class="command">script.bat -h</strong>.
  </p>
  
  <p class="para">
   Voir aussi l&#039;extension <a href="ref.readline.php" class="link">Readline</a>,
   qui dispose de nombreuses fonctions pour améliorer la convivialité
   des applications PHP en ligne de commande.
  </p>
  
  <p class="para">
   Sous Windows, PHP peut être configuré pour fonctionner sans avoir
   besoin de fournir les extensions <var class="filename">C:\php\php.exe</var>
   ou <code class="literal">.php</code>, tel que décrit dans
   <a href="install.windows.commandline.php" class="link">la ligne de commande PHP sous
    Microsoft Windows</a>.
  </p>

  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Sous Windows, il est recommandé d&#039;exécuter PHP sous un compte utilisateur.
    Lorsque PHP est exécuté sous un service réseau, certaines opérations peuvent
    échouer, car &quot;Aucun lien entre les noms de compte et les identifiants de
    sécurité n&#039;est réalisé&quot;.
   </p>
  </p></blockquote>
  
 </div><?php manual_footer($setup); ?>