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.
CLI est lancé en mode silencieux par défaut, bien que les options -q et --no-header soient gardées pour rester compatible avec les anciennes versions CGI.
Il ne change pas le répertoire courant en celui du script. (les options -C et --no-chdir sont gardées par souci de compatibilité)
Messages d'erreurs en texte brut (pas de formatage HTML).
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êt. 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 le contenu une dernière fois. |
max_execution_time | 0 (sans limite) | Étant données 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. Les variables PHP $argc et $argv sont définies et remplies avec les valeurs appropriées, en utilisant CLI SAPI. vous pouvez toujours accéder à $_SERVER et $HTTP_SERVER_VARS. Par exemple : $_SERVER['argv'] |
output_buffering | FALSE |
Même si cette configuration INI est codée en dur à FALSE, les fonctions relatives à l'affichage du buffer sont disponibles. |
max_input_time | FALSE |
Le PHP CLI ne supporte pas GET, POST et le téléchargement de fichiers. |
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 register_argc_argv).
Note:
Il est recommandé de définit ignore_user_abort pour les scripts en ligne de commande. Voir la fonction ignore_user_abort() pour plus d'informations.
Pour faciliter le travail en environnement shell, plusieurs constantes sont définies pour les flux I/O.
Le CLI SAPI ne transforme pas le dossier courant en dossier d'exécution du script !
Exemple #1 Exemple montrant la différence avec le SAPI CGI :
<?php
// Un test simple : affiche le dossier d'exécution */
echo getcwd(), "\n";
?>
Lorsque vous utilisez la version CGI, l'affichage sera :
$ pwd /tmp $ php -q autre_dossier/test.php /tmp/autre_dossier
Cela montre 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:
Le CGI SAPI se comporte de la même façon que le CLI SAPI, en lui passant l'option -C , lorsque vous l'invoquez en ligne de commande.