Exécution de fichiers PHP
Il y a 3 façons différentes d'appeler le CLI SAPI avec du code PHP
à exécuter :
-
Indiquer à PHP d'exécuter un fichier donné :
Les deux méthodes (en utilisant -f ou pas) exécutent le
script contenu dans le fichier mon_script.php.
Notez qu'il n'existe pas de restriction sur les fichiers pouvant
être exécutés ; en particulier, il n'est pas nécessaire que l'extension
du fichier soit .php
.
-
Donner du code PHP à exécuter directement en ligne de commande.
Une attention particulière doit alors être apportée aux variables d'environnement,
qui seront remplacées, et aux guillemets, 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 rend caduque l'utilisation de celles-ci, et les ajouter conduirait
alors à une erreur d'analyse syntaxique.
-
Alimenter l'entrée standard en code PHP
(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 :
Il n'est pas possible de combiner ces trois modes d'exécution.
Comme toute application shell, l'exécutable PHP accepte
des arguments ; cependant, le script PHP peut aussi en recevoir.
Le nombre d'arguments pouvant être passés à votre script n'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, vous n'atteindrez pas cette limite). Les arguments passés au script seront
transmis via la variable tableau $argv. Le premier
index (zéro) contient toujours le nom du script appelé depuis la ligne
de commande. Notez que, si le code est exécuté en ligne en utilisant
l'option de ligne commande -r, la valeur de $argv[0]
sera "Standard input code"
; antérieur à PHP 7.2.0,
c'était un tiret ("-"
) à la place. Cela est aussi vrai si
le code est exécuté via un pipe depuis STDIN
.
Une seconde variable globale, $argc, contient le nombre
d'éléments du tableau $argv
(et non pas le nombre d'arguments passés
à votre script).
Tant que les arguments passés au script ne commencent pas par
le caractère -
, il n'y a rien de spécial à surveiller.
Le fait de passer des arguments au script qui commencent par
-
pose 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 au script sans être modifiés ou analysés par PHP.
Cependant, il y a une autre méthode pour utiliser PHP en script shell ;
la première ligne du script devra être #!/usr/bin/php
(à remplacer par le chemin vers le binaire PHP CLI 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'exécution sur le
script (chmod +x test), il peut être exécuté comme un script
shell ou perl habituel :
Exemple #1 Exécute un script PHP en tant que script shell
#!/usr/bin/php
<?php
var_dump($argv);
?>
En supposant que ce fichier s'appelle test, dans le
dossier courant, il est alors possible de faire ceci :
$ chmod +x test
$ ./test -h -- foo
array(4) {
[0]=>
string(6) "./test"
[1]=>
string(2) "-h"
[2]=>
string(2) "--"
[3]=>
string(3) "foo"
}
Comme vous pouvez le voir, dans ce cas, vous n'avez pas besoin
de faire attention lors du passage de paramètres qui commencent par
-
à votre script.
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 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, 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
l'exécution sous Windows, ce qui rend les scripts facilement portables. Un exemple
complet est disponible ci-dessous :
Exemple #2 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];
}
?>
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 CLI, aussi,
aucun en-tête HTTP ne sera affiché.
Le programme commence par vérifier que l'argument requis est spécifié
(en plus du nom du script, qui est aussi compté). S'il n'est pas présent,
ou si l'argument est --help, -help,
-h ou -?, un message d'aide sera affiché,
en utilisant $argv[0] pour afficher dynamiquement le nom
du script tel qu'entré dans la ligne de commande. Sinon, l'argument est affiché
tel qu'il a été entré dans le terminal.
Pour exécuter le script ci-dessus sous Unix, vous devez le rendre
exécutable, puis l'appeler avec une commande comme :
script.php echothis ou
script.php -h. Sous Windows, vous pouvez faire un
fichier batch pour cela :
Exemple #3 Fichier batch pour exécuter un script PHP en ligne de commande (script.bat)
@echo OFF
"C:\php\php.exe" script.php %*
En supposant que le programme ci-dessus est nommé
script.php, et que l'exécutable CLI
php.exe se trouve dans
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 des applications PHP en ligne de commande.
Sous Windows, PHP peut être configuré pour fonctionner sans avoir
besoin de fournir les extensions C:\php\php.exe
ou .php
, tel que décrit dans
la ligne de commande PHP sous
Microsoft Windows.
Note:
Sous Windows, il est recommandé d'exécuter PHP sous un compte utilisateur.
Lorsque PHP est exécuté sous un service réseau, certaines opérations peuvent
échouer, car "Aucun lien entre les noms de compte et les identifiants de
sécurité n'est réalisé".