<?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.interactive.php',
    1 => 'Shell Interactif',
    2 => 'Shell Interactif',
  ),
  'up' => 
  array (
    0 => 'features.commandline.php',
    1 => 'Utilisation des lignes de commande',
  ),
  'prev' => 
  array (
    0 => 'features.commandline.io-streams.php',
    1 => 'Flux I/O',
  ),
  'next' => 
  array (
    0 => 'features.commandline.webserver.php',
    1 => 'Serveur web interne',
  ),
  '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.interactive" class="section">
  <h2 class="title">Shell Interactif</h2>
  
  <p class="para">
   Le <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> fournit un shell interactif lors de l&#039;utilisation
   de l&#039;option <strong class="option unknown">-a</strong> si PHP a été compilé avec l&#039;option <strong class="option configure">--with-readline</strong>.
   À partir de PHP 7.1.0, le shell interactif est également disponible sur Windows,
   si l&#039;<a href="book.readline.php" class="link">extension readline</a> est activée.
  </p>
  
  <p class="para">
   En utilisant le shell interactif, il est possible de taper du code PHP
   et qu&#039;il soit exécuté directement.
  </p>
  
  <div class="example" id="example-1">
   <p><strong>Exemple #1 Exécution de code en utilisant le shell interactif</strong></p> 
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">$ php -a
Interactive shell

php &gt; echo 5+8;
13
php &gt; function addTwo($n)
php &gt; {
php { return $n + 2;
php { }
php &gt; var_dump(addtwo(2));
int(4)
php &gt;</pre>
</div>
   </div>

  </div>
  
  <p class="simpara">
   Le shell interactif fournit également une autocomplétion des fonctions,
   des constantes, des noms de classes, des variables, des appels aux méthodes
   statiques et des constantes de classes en utilisant la touche de tabulation.
   À partir de PHP 8.4.0, le chemin vers le fichier d&#039;historique peut être défini en utilisant la
   variable d&#039;environnement <var class="envar">PHP_HISTFILE</var>.
  </p>
  
  <div class="example" id="example-2">
   <p><strong>Exemple #2 Auto-complétion en utilisant la touche de tabulation</strong></p>
   <div class="example-contents"><p>
    Le fait de presser deux fois la touche de tabulation lorsqu&#039;il y a plusieurs
    complétions possibles affichera une liste de ces complétions :
   </p></div>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">php &gt; strp[TAB][TAB]
strpbrk   strpos    strptime  
php &gt; strp</pre>
</div>
   </div>

   <div class="example-contents"><p>
    Lorsqu&#039;il n&#039;y a qu&#039;une seule complétion possible, presser la touche de tabulation
    une seule fois complétera le reste sur la même ligne :
   </p></div>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">php &gt; strpt[TAB]ime(</pre>
</div>
   </div>

   <div class="example-contents"><p>
    La complétion fonctionnera aussi pour les noms qui ont été définis lors
    de la session courante du shell interactif :
   </p></div>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">php &gt; $fooThisIsAReallyLongVariableName = 42;
php &gt; $foo[TAB]ThisIsAReallyLongVariableName</pre>
</div>
   </div>

  </div>
  
  <p class="para">
   Le shell interactif stocke l&#039;historique et peut y accéder en utilisant les touches
   haut et bas. L&#039;historique est sauvegardé dans le fichier <var class="filename">~/.php_history</var>.
  </p>
  
  <p class="para">
   Le <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> fournit 2 directives du <var class="filename">php.ini</var> :
   <code class="parameter">cli.pager</code> et <code class="parameter">cli.prompt</code>.
   La directive <code class="parameter">cli.pager</code> permet la définition d&#039;un programme
   externe (comme <var class="filename">less</var>) à utiliser comme pager pour la sortie
   au lieu d&#039;afficher directement sur l&#039;écran. La directive
   <code class="parameter">cli.prompt</code> autorise la modification du prompte
   <code class="literal">php &gt;</code>.
  </p>
  
  <p class="para">
   Il est également possible de définir des directives du <var class="filename">php.ini</var>
   dans un shell interactif en utilisant des notations raccourcies.
  </p>
  
  <div class="example" id="example-3">
   <p><strong>Exemple #3 Définition de directives du <var class="filename">php.ini</var> dans un shell interactif</strong></p>
   <div class="example-contents"><p>
    La définition de la directive <code class="parameter">cli.prompt</code> :
   </p></div>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">php &gt; #cli.prompt=hello world :&gt; 
hello world :&gt;</pre>
</div>
   </div>

   <div class="example-contents"><p>
    En utilisant des backticks, il est possible d&#039;exécuter du code PHP
    dans le prompte :
   </p></div>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">php &gt; #cli.prompt=`echo date(&#039;H:i:s&#039;);` php &gt; 
15:49:35 php &gt; echo &#039;hi&#039;;
hi
15:49:43 php &gt; sleep(2);
15:49:45 php &gt;</pre>
</div>
   </div>

   <div class="example-contents"><p>
    Définition du pager à <var class="filename">less</var> :
   </p></div>
   <div class="example-contents">
<div class="shellcode"><pre class="shellcode">php &gt; #cli.pager=less
php &gt; phpinfo();
(sortie affichée avec less)
php &gt;</pre>
</div>
   </div>

  </div>
  
  <p class="para">
   La directive <code class="parameter">cli.prompt</code> supporte quelques séquences d&#039;échappement :
   <table class="doctable table">
    <caption><strong>Séquences d&#039;échappement de <code class="parameter">cli.prompt</code></strong></caption>
    
     <thead>
      <tr>
       <th>Séquence :</th>
       <th>Description :</th>
      </tr>

     </thead>

     <tbody class="tbody">
      <tr>
       <td><code class="literal">\e</code></td>
       <td>
        utilisé pour ajouter des couleurs au prompte. Exemple :
        <code class="literal">\e[032m\v \e[031m\b \e[34m\&gt; \e[0m</code>
       </td>
      </tr>

      <tr>
       <td><code class="literal">\v</code></td>
       <td>La version de PHP.</td>
      </tr>

      <tr>
       <td><code class="literal">\b</code></td>
       <td>
        Indique dans quel bloc de PHP nous nous trouvons.
        Par exemple, <code class="literal">/*</code> permet d&#039;indiquer que nous
        sommes dans un commentaire multilignes. Le scope externe est représenté
        par <code class="literal">php</code>.
       </td>
      </tr>

      <tr>
       <td><code class="literal">\&gt;</code></td>
       <td>
        Indique le caractère utilisé pour le prompte. Par défaut, ce sera
        <code class="literal">&gt;</code>, mais peut être modifié lorsque le shell se
        trouve dans un bloc indéterminé ou dans une chaîne de caractères.
        Les caractères possibles sont : <code class="literal">&#039; &quot; {
        ( &gt;</code>
       </td>
      </tr>

     </tbody>
    
   </table>

  </p>
  
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Les fichiers inclus via <a href="ini.core.php#ini.auto-prepend-file" class="link">auto_prepend_file</a> et <a href="ini.core.php#ini.auto-append-file" class="link">auto_append_file</a> sont analysés
    dans ce mode, mais avec quelques restrictions - c.-à-d. les fonctions
    doivent avoir été définies avant l&#039;appel.
   </p>
  </p></blockquote>

  <div class="section" id="features.commandline.interactive.mode">
   <h2 class="title">Mode interactif</h2>
   <p class="para">
    Si l&#039;extension readline n&#039;est pas disponible, antérieur à PHP 8.1.0,
    invoquer le <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> avec l&#039;option <strong class="option unknown">-a</strong> fournit le mode interactif.
    Dans ce mode, un script PHP complet est supposé être donné via STDIN,
    et après l&#039;interruption
    avec
    <kbd class="keycombo">
     <kbd class="keycap">CTRL</kbd>
     +<kbd class="keycap">D</kbd>
    </kbd>
    (POSIX) ou
    <kbd class="keycombo">
     <kbd class="keycap">CTRL</kbd>
     +<kbd class="keycap">Z</kbd>
    </kbd>
    suivi de +<kbd class="keycap">ENTER</kbd> (Windows), ce script sera évalué.
    Ceci est basiquement identique à invoquer le <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> sans l&#039;option <strong class="option unknown">-a</strong>.
   </p>
   <p class="para">
    À partir de PHP 8.1.0, invoquer le <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> avec l&#039;option <strong class="option unknown">-a</strong>
    échoue, si l&#039;extension readline n&#039;est pas disponible.
   </p>
  </div>
 </div><?php manual_footer($setup); ?>