6 Caractéristiques 
 Manuel PHP 
 . Identification HTTP avec PHP . Cookies . Gestion des chargements de fichier . Utilisation des fichiers à distance . Gestion des connexions . Connexions persistantes aux bases de données . Safe mode ->Utiliser PHP en ligne de commande
 
  | 
 
  6.8 Utiliser PHP en ligne de commande 
 
  Depuis la version 4.3,  
PHP
  supporte un nouveau type
  de  
SAPI
  (Server Application Programming Interface,
  c'est à dire Interface de Programmation d'Applications Serveur) appelé
   
CLI
 , ce qui signifie  
Command Line Interface
 
  et se traduit par  
Interface de Ligne de Commande
 . 
  Comme son nom l'indique, ce type  
SAPI
  cible les
  applications shell (ou desktop), écrites en PHP. Il y a pas mal de
  différences enter le type  
CLI SAPI
  et les autres
   
SAPI
 , qui sont expliqués dans ce chapitre.
  
 
  Le  
CLI SAPI
  a été publié pour la première fois avec
  la version  
PHP 4.2.0
 , mais il est resté expérimental,
  et doit être explicitement activé avec la commande  
--enable-cli
 ,
  lorsque vous exécutez le script  
./configure
 . Depuis
  PHP 4.3.0, le  
CLI SAPI
  n'est plus expérimental, et
  est donc  
toujours
  compilé et 
  installé comme binaire PHP (appelé aussi  
php.exe
  sous
  Windows).
  
 
  Les différences les plus notables entre le  
CLI SAPI
  et les 
   
SAPI
  sont :
   
 
- 
     Contrairement au  
CGI SAPI
 , aucun en-tête HTTP n'est écrit
     dans le résultat.
    
     Bien que le  
CGI SAPI
  fournisse un moyen de supprimer les
     en-têtes HTTP, il n'y a pas moyen d'activer les en-têtes HTTP dans le 
      
CLI SAPI
 .
      
- 
     Il y a plusieurs directives du  
php.ini
  qui sont ignorées par le 
      
CLI SAPI
 , car elles n'ont pas de sens, en environnement
     shell : 
      
| Directive | 
Valeur par défaut pour 
CLI SAPI
 | 
Commentaire | 
 
| html_errors | 
FALSE
 | 
          Il peut être bien difficile de lire les messages d'erreur sur un terminal
          lorsqu'ils sont noyés dans des balises HTML sans grand intérêts. Par
          conséquent, cette directive est forcée à 
FALSE
.
          | 
 
| implicit_flush | 
TRUE
 | 
          Il est souhaitable que tout affichage en provenance de 
          
print
, 
echo
 et consorts soit
          immédiatement affiché dans le terminal, et non pas placé dans un
          buffer quelconque. Vous pouvez toujours utiliser 
          la bufferisation de sortie
          si vous voulez retarder un affichage, ou bien en manipuler ultimement
          le contenu.
          | 
 
| max_execution_time | 
0 (unlimited) | 
          Etant donné les possibilités infinies de PHP en 
          environnement shell, le temps d'exécution maximal d'un 
          script PHP a été rendu illimité.
          Alors que les scripts destinés au web doivent s'accomplir en une 
          fraction de seconde, il arrive que les scripts shell requièrent
          bien plus de temps.
          | 
 
| register_argc_argv | 
TRUE
 | 
 
          En donnant la valeur de  
TRUE
  à cette directive, vous aurez toujours
          accès à la variable  
argc
  (représentant le nombre
          d'arguments passés à l'application) et 
           
argv
  (le tableau contenant les arguments passés)
          dans le  
CLI SAPI
 .
          
          Depuis  
PHP
  4.3.0, les variables  
$argc
 
          et  
$argv
  sont définies et remplies avec les valeurs
          appropriées, en utilisant  
CLI SAPI
 . Avant cette version,
          la création de ces variables était liée au comportement des versions 
           
CGI
  et  
MODULE
 , qui requièrent l'activation
          de la directive  
PHP
 register_globals . 
          Indépendamment de la version ou de la valeur de register_globals,
          vous pouvez toujour accéder à 
           
$_SERVER
  et
           
$HTTP_SERVER_VARS
 .  Par exemple:
           
$_SERVER['argv']
 
 | 
 
 
| Note |  | 
 
      Ces directives ne peuvent pas être initialisées avec d'autres valeurs
      dans le fichier  
php.ini
  ou par une autre méthode. C'est une limitation,
      car ces valeurs par défaut s'appliquent une fois que tous les autres
      fichiers de configuration ont été analysés. Cependant, ces
      valeurs peuvent être modifiées durant l'exécution (ce qui n'est pas
      logique pour certaines directives, comme par exemple 
       register_argc_argv ).
      
 |  
  
- 
     Pour faciliter le travail en environnement shell, les constantes suivantes
     sont définies : 
      
| Constante | 
Déscription | 
 
| 
STDIN
 | 
         Un descripteur de fichier déjà disponible vers 
stdin
. 
         Cela évite de l'ouvrir avec 
         
$stdin = fopen('php://stdin', 'r');
 
 | 
 
| 
STDOUT
 | 
         Un descripteur de fichier déjà disponible vers 
stdout
.
         Cela évite de l'ouvrir avec 
         
$stdout = fopen('php://stdout', 'w');
 
 | 
 
| 
STDERR
 | 
         Un descripteur de fichier déjà disponible vers 
         
stderr
. Cela évite de l'ouvrir avec 
         
$stderr = fopen('php://stderr', 'w');
 
 | 
 
 
     Etant donné ce qui précède, vous n'avez pas besoin d'ouvrir un fichier
     vers  
stderr
  par vous-même, mais vous pouvez utiliser
     cette constante directement, comme un descripteur de fichier : 
      
 
php -r 'fwrite(STDERR, "stderr\n");'
 
 
     Vous n'avez pas non plus à fermer explicitement ces fichiers, PHP s'en 
     chargera automatiquement.
     
- 
CLI SAPI
 
ne transforme pas
 
     le dossier courant en dossier d'exécution du script!
    
     Exemple de différence entre  
CGI SAPI
  et  
CLI SAPI
 :
      
 
<?php     /* Un test simple : affiche le dossier d'exécution */     echo getcwd(), "\n"; ?>
 
     Lorsque vous utilisez la version  
CGI
 , l'affichage pourra être
      
 
$ pwd 
/tmp 
 
$ php-cgi -f autre_dossier/test.php 
/tmp/autre_dossier 
     
 
     Cela monter clairement que  
PHP
  modifie le dossier
     courant, et utilise le dossier du script exécuté.
     
     En utilisant le  
CLI SAPI
 , on obtient :
      
 
$ pwd 
/tmp 
 
$ php -f autre_dossier/test.php 
/tmp 
     
 
     Cela donne beaucoup plus de souplesse lorsque vous rédigez des
     scripts shell avec  
PHP
 .
     
| Note |  | 
 
CGI SAPI
  supporte le même comportement de 
       
CLI SAPI
 , en lui passant l'option 
       
-C
 , lorsque vous l'invoquez en ligne de commmande.
      
 |  
  
 
 
  La liste des options de ligne de commande fournies par  
PHP
 
  est disponible en exécutant  
PHP
  avec l'option  
-h
  :
   
 
Usage: php [options] [-f] <file> [args...] 
       php [options] -r <code> [args...] 
       php [options] [-- args...] 
  -s               Display colour syntax highlighted source. 
  -w               Display source with stripped comments and whitespace. 
  -f <file>        Parse <file>. 
  -v               Version number 
  -c <path>|<file> Look for php.ini file in this directory 
  -a               Run interactively 
  -d foo[=bar]     Define INI entry foo with value 'bar' 
  -e               Generate extended information for debugger/profiler 
  -z <file>        Load Zend extension <file>. 
  -l               Syntax check only (lint) 
  -m               Show compiled in modules 
  -i               PHP information 
  -r <code>        Run PHP <code> without using script tags <?..?> 
  -h               This help 
 
  args...          Arguments passed to script. Use -- args when first argument  
                   starts with - or script is read from stdin 
  
 
 
  Le  
CLI SAPI
  dispose de trois moyens pour lire le 
  code du script PHP que vous voulez exécuter : 
   
 
- 
     Indiquer à  
PHP
  d'exécuter un fichier : 
    
 
php mon_script.php 
 
php -f mon_script.php 
     
 
     Les deux méthodes (en utilisant  
-f
  ou pas) exécute le
     script contenu dans le fichier  
mon_script.php
 . Vous 
     pouvez choisir n'importe quel fichier, et ces fichiers ne sont pas
     tenus d'utiliser l'extension  
.php
 . N'importe
     quelle extension peut faire l'affaire.
      
- 
     Donner du code  
PHP
  à exécuter directement en ligne de commande.
    
 
php -r 'print_r(get_defined_constants());' 
     
 
     Une attention particulière doit alors être apportée aux variables d'environnement,
     qui seront remplacées, et aux guillements, qui ont des significations spéciales en
     ligne de commande.
     
| Note |  | 
 
      Lisez l'exemple attentivement, il n'y a ni balise d'ouverture, ni balise de fermeture!
      L'option  
-r
  fonctionne sans ces balises, et les ajouter conduira
      alors à une erreur d'analyse.
      
 |  
  
- 
     Donner du code  
PHP
  dans l'entrée standard 
     ( 
stdin
 ).
    
     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 :
      
 
$ some_application | some_filter | php | sort -u >final_output.txt 
     
  
 
 
  Il n'est pas possible de combiner ces trois modes d'exécution.
 
 
  Comme toute application shell, l'exécutable  
PHP
  accepte
  des arguments, et votre script peut aussi les recevoirs. Le nombre d'arguments
  n'est pas limité par PHP, mais par le shell, qui a une limite en terme
  de nombre de caractères qui peuvent être passés. Généralement, vous n'atteidrez
  pas cette limite, mais cela reste possible. Les arguments passés au script seront
  transmis via la variable tableau  
$argv
 . L,index zéro 
  contiendra toujours le nom du script appelé. Si le code a été fourni en ligne
  de commande, ou via  
stdin
 , ce premier élément vaudra
   
-
 . L'autre variable globale fournie est 
   
$argc
  qui contient le nombre d'éléments dans le tableau
   
$argv
  : ce nombre est  
différent
  
  du nombre d'arguments passés au script.
  
 
  Tant que les arguments que vous passez à votre script ne commencent pas par 
  le caractère  
-
 , il n'y a rien de spécial à surveiller.
  Si vous passez des arguments à voter script qui commencent par 
   
-
 , cela posera des problèmes car  
PHP
 
  va penser qu'il doit les interpréter. Pour éviter cela, utilisez le séparateur
   
--
 . Après cet argument, tous les arguments suivants seront
  passés à votre script sans être modifié ou analysé par PHP.
  
 
 
# Cela ne va pas exécuter le code, mais afficher l'aide de PHP 
$ php -r 'var_dump($argv);' -h 
Usage: php [options] [-f] <file> [args...] 
[...] 
 
# Cela va passer l'argument '-h' à votre script, et éviter que PHP ne le traite 
$ php -r 'var_dump($argv);' -- -h 
array(2) { 
  [0]=> 
  string(1) "-" 
  [1]=> 
  string(2) "-h" 
} 
 
 
  Cependant, il y a une autre méthode pour utiliser PHP en script shell.
  Vous pouvez aussi utiliser la ligne  
#!/usr/bin/php
  
  en tout début de votre script, suivi de code PHP compris entre
  balise ouvrantes/fermantes. Vous pouvez aussi ajouter après 
   
#!/usr/bin/php
  les options nécessaires. Vous 
  pouvez aussi le faire en ligne de commande.
  De cette manière, le script peut être exécuté comme un script
  shell habituel :
   
 
#!/usr/bin/php <?php     var_dump($argv); ?>
 
 
  En supposant que ce fichier s'appelle 
test
 , dans le
  dossier courant, nous pouvons alors faire ceci : 
   
 
$ chmod 755 test 
$ ./test -h -- foo 
array(4) { 
  [0]=> 
  string(6) "./test" 
  [1]=> 
  string(2) "-h" 
  [2]=> 
  string(2) "--" 
  [3]=> 
  string(3) "foo" 
} 
  
 
  Comme vous le voyez, aucune précaution n'est nécessaire pour passer des 
  paramètres qui commencent par  
-
  à votre script.
 
 
 
| Option | 
Description | 
 
| -s | 
 
        Affiche le code avec la colorisation syntaxique.
        
        Cette option utilise le mécanisme interne pour analyser le fichier,
        et produire une version colorisée du code source, au format HTML.
        Notez que cette option ne fait que générer un bloc
         
HTML
 , sans les en-têtes.
         
<code> [...] </code>
 
| Note |  | 
 
         Cette option ne fonctionne pas avec l'option  
-r
 .
         
 |   
 | 
 
| -w | 
 
        Affiche la source sans les commentaires et les espaces.
        
| Note |  | 
 
         Cette option ne fonctionne pas avec l'option  
-r
 .
         
 |   
 | 
 
| -f | 
 
        Analyse et exécute le fichier donné après l'option  
-f
 .
        Cette optione est optionnelle, et peut être omise. Le seul nom du fichier
        est suffisant.
        
 | 
 
| -v | 
 
        Affiche les versions de PHP, PHP SAPI, et Zend sur le terminal. Par exemple : 
         
 
$ php -v 
PHP 4.3.0-dev (cli), Copyright (c) 1997-2002 The PHP Group 
Zend Engine v1.2.1, Copyright (c) 1998-2002 Zend Technologies 
        
 
 | 
 
| -c | 
 
        Avec cette option, vous pouvez spécifier le nom du dossier dans lequel
        PHP va recherche le fichier  
php.ini
 , ou encore vous pouvez
        spécifier un fichier de configuration directement (qui n'a pas
        obligatoirement à être appelé  
php.ini
 ) :
         
 
$ php -c /custom/directory/ mon_script.php 
 
$ php -c /custom/directory/custom-file.ini mon_script.php 
        
 
 | 
 
| -a | 
 
        Exécute PHP de manière interactive.
        
        
 | 
 
| -d | 
 
        Cette option permet de modifier n'importe quelle directive de configuration
        du fichier  
php.ini
 . La syntaxe est :
         
 
-d configuration_directive[=value] 
        
 
        Exemples:
         
 
# L'omission de la valeur conduit à donner la valeur de "1" 
$ php -d max_execution_time -r '$foo = ini_get("max_execution_time"); var_dump($foo);' 
string(1) "1" 
 
# Passer une valeur vide conduit à donner la valeur de "" 
php -d max_execution_time= -r '$foo = ini_get("max_execution_time"); var_dump($foo);' 
string(0) "" 
 
# La directive de configuration sera n'importe quelle valeur passée après le caractère '=' 
$  php -d max_execution_time=20 -r '$foo = ini_get("max_execution_time"); var_dump($foo);' 
string(2) "20" 
$  php -d max_execution_time=doesntmakesense -r '$foo = ini_get("max_execution_time"); var_dump($foo);' 
string(15) "doesntmakesense" 
        
 
 | 
 
| -e | 
 
        Génére des informations étendues pour le profilage et le débogage.
        
        
 | 
 
| -z | 
 
        Charge une extension Zend. Si seulement un fichier est fourni, PHP
        essaie de charger cette extension dans le dossier courant par défaut
        des librairie sur votre système (généralement spécifié avec 
         
/etc/ld.so.conf
  sous Linux). Passer un nom de
        fichier avec le chemin complet fera que PHP utilisera ce fichier,
        sans recherche dans les dossiers classiques. Un chemin de dossier
        relatif indiquera à PHP qu'il doit chercher uniquement les extensions
        dans ce dossier.
        
 | 
 
| -l | 
 
        Cette option permet de faire une vérification syntaxique sur le code
        PHP fourni. En cas de réussite, le message 
         
No syntax errors detected in <filename>
  
        ( 
Aucune d'erreur de syntaxe n'ont été détectées dans <nom_de_fichier>
  
        est affiché sur la sortie standard, et le script shell retourne
         
0
 . En cas d'erreur, le message 
         
Errors parsing <filename>
  
        ( 
Erreurs d'analyse dans le fichier <filename>
 ) 
        est affiché, en plus des messages d'erreurs détectés par l'analyseur
        lui même. Le script shell retourne le code  
255
 .
        
        Cette option ne détecte pas les erreurs fatales (comme par exemple les
        fonctions non définies). Utilisez  
-f
  si vous voulez
        tester aussi ces erreurs.
        
| Note |  | 
 
         Cette option ne fonctionne pas avec l'option  
-r
 .
         
 |   
 | 
 
| -m | 
 
        Cette option liste les extensions PHP et Zend compilées et chargées : 
         
 
$ php -m 
[PHP Modules] 
xml 
tokenizer 
standard 
session 
posix 
pcre 
overload 
mysql 
mbstring 
ctype 
 
[Zend Modules] 
        
 
 | 
 
| -i | 
       Cette option appelle la fonction 
phpinfo
, et
       affiche le résultat. Si 
PHP
 ne fonctionne pas
       correctement, il est recommandé d'utiliser la commande 
php -i
 
       et de voir si il n'y a pas d'erreurs affichées avant ou après la
       table d'information. N'oubliez pas que le résutltat de cette
       option est au format 
HTML
, et donc grand
       et illisible directement.
       | 
 
| -r | 
 
        Cette option permet l'exécution de  
PHP
  directement
        dans la ligne de commande. Les balises de  
PHP
  
        ( 
<?php
  et  
?>
 ) 
         
ne sont pas
  demandées, et coauseront
        une erreur d'analyse.
        
| Note |  | 
 
         De l'attention doit être portée lors de l'utilisation de cette option
         de  
PHP
 , pour qu'il n'y ait pas de collision avec
         les substitutions de variables en lignes de commande, réalisées par le
         shell.
         
         Exemple conduisant à une erreur d'analyse : 
          
 
$ php -r "$foo = get_defined_constants();" 
Command line code(1) : Parse error - parse error, unexpected '=' 
         
 
         Le problème ici est que le shell (sh/bash) effectue une substitution
         de variables, grâce aux guillemets doubles  
"
 . 
         puisque la variable  
$foo
  n'est probablement pas
         définie dans le shell, elle est remplacée par rien, ce qui fait
         que le code passé à PHP pour l'exécution est : 
          
 
$ php -r " = get_defined_constants();" 
         
 
         La solution de ce problème est d'utiliser les guillemets simples
          
'
 . Les variables de ces chaînes ne seront pas
         substituées par leurs valeurs par le shell.
          
 
$ php -r '$foo = get_defined_constants(); var_dump($foo);' 
array(370) { 
  ["E_ERROR"]=> 
  int(1) 
  ["E_WARNING"]=> 
  int(2) 
  ["E_PARSE"]=> 
  int(4) 
  ["E_NOTICE"]=> 
  int(8) 
  ["E_CORE_ERROR"]=> 
  [...] 
         
 
         Si vous utilisez un shell différent de sh/bash, vous pouvez
         rencontrer d'autres problèmes. N'hésitez pas à ouvrir un
         rapport de bugs, ou d'envoyer un mail à 
         phpdoc@lists.php.net.
         Il est toujours très facile d'avoir des problèmes lorsque vous essayez
         d'inclure des variables shell dans le code, ou d'utiliser les anti-slash
         pour l'échappement. Vous aurez été prévenu.
       
         
 |   
 | 
 
| -h | 
       Avec cette option, vous pouvez obtenir des informations sur la liste des
       options supporté par votre PHP, avec des explications succintes.
       | 
 
 
 
  L'exécutable PHP peut être utilisé pour exécuter des scripts indépendants du
  serveur web. Si vous êtes sur un système Unix, il est recommandé d'ajouter
  la ligne de configuration en début de scripts, de le rendre exécutable de
  manière à ce que le système sache quel programme doit exécuter le script.
  Sous Windows, vous pouvez associer l'exécutable  
php.exe
  
  avec le double-clic sur les fichiers d'extension  
.php
 ,
  ou bien vous pouvez 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
  PHP sous Windows, ce qui rend les scripts facilements portables. Un exemple
  complet est disponible ci-dessous : 
  
 
| Script prévu pour être exécuté en ligne de commande (script.php) |  
#!/usr/bin/php <?php
  if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) { ?>
  C'est une ligne de commande à une option.
    Utilisation :   <?php echo $argv[0]; ?> <option>
    <option> peut être un mot que vous souhaitez afficher.   Avec les options --help, -help, -h,   et -?, vous obtiendrez cette aide.    <?php } else {     echo $argv[1]; } ?>
 
 |   
 
  Dans le script ci-dessus, nous utilisons la première ligne pour indiquer
  que le fichier doit être exécuté par PHP. Nous travaillons avec une version
  CLI, donc il n'y a pas d'en-têtes HTTP qui soient affichés. Il y a deux
  variables que vous pouvez utiliser avec les applications de ligne de commande :
   
$argc
  et  
$argv
 . La première
  est le nombre d'arguments plus un (le nom du script qui est
  exécuté). La seconde est un tableau contenant les arguments, commençant
  avec le nom du script en élément 0 ( 
$argv[0]
 ).
  
 
  Dans notre exemple, nous avons vérifié qu'il y a plus ou moins d'un
  argument. De plus, si cet argument est  
--help
 ,
   
-help
 ,  
-h
  ou  
-?
 ,
  nous avons affiché un message d'aide, ainsi que le nom du
  script. Nous nous recevons un autre argument, cet argument est affiché
  dans le terminal.
  
 
  Pour exécuter le script ci-dessus sous Unix, vous devez le rendre
  exécuétable, puis l'appeler avec une commande comme : 
   
script.php echothis
  ou
   
script.php -h
 . Sous Windows, vous pouvez faire un
  fichier batch pour cela :
   
 
| Fichier batch pour exécuter un script PHP en ligne de commande (script.bat) |  
@c:\php\php.exe script.php %1 %2 %3 %4
 
 |   
 
  Si vous avez nommé le programme ci-dessus 
   
script.php
 , et que vous avez votre exécutable
   
php.exe
  situé à 
   
c:\php\php.exe
 , ce fichier batch l'exécutera
  avec les options que vous lui passez : 
   
script.bat echothis
  ou
   
script.bat -h
 .
  
 
  Voir aussi l'extension  Readline ,
  qui dispose de nombreuses fonctions pour améliorer la convivialité
  de vos applications en ligne de commande.
  
 |