Exécution de commandes avec PHP

le 22/05/2009 à 21:10
Exécution de commandes avec PHP
Bien moins connue, l'utilisation de PHP en ligne de commande rend bien des services.
Cet article explique les différentes manières d'exécuter des commandes système avec PHP.

- Use command-line tools in PHP

A lire également

L'option -a de PHP-CLI (en ligne de commande), active le mode interactif de PHP. C'est un mode où les instructions seront exécutées au fur et à mesure que vous les tapez.


$ php -a
Interactive mode enabled

html
<?php
html
echo phpversion();
5.2.6 ?>

Notez que c'est difficile à comprendre sur l'exemple ci-dessus : PHP commence par produire les deux premières lignes. Puis, j'ai tapé html, qui est affiché une deuxième fois plus bas, quand PHP décide d'exécuter le code HTML initial. En effet, le mode interactif se comporte comme PHP, et affiche directement le texte qui n'est pas dans une balise.

Ensuite, je met des commandes complètes (ici, PHPversion()), qui est affichée immédiatement après. Au final, je ferme la balise.

Ce mode est pratique si vous voulez tester une fonction ou un bout de code PHP. En en discutant avec Chris Hartjes (si vous avez l'occasion, allez le voir en conférence), ce mode est très pratique pour mettre en place les tests unitaires : il l'a fait pour cakePHP.

Imaginez, vous avez programmé une fonction (ou une classe, ou une bibliothèque, etc). Pour la vérifier, vous l'exécutez avec le mode interactif, et vous vérifiez manuellement que tout se passe bien. Par exemple, avec une fonction qui teste si un nombre est premier (retourne 0 si oui, et un facteur sinon), on pourrait avoir ceci :

<?php
include('prime.php');
print is_prime(4);
4
print is_prime(7);
0
print is_prime(13);
0
print is_prime(49);
0
?>

Je viens de tester 4 valeurs, et j'ai identifié un bug (49). Idéalement, je vais retourner dans mon code, le corriger. Mais cette liste de tests manuels pourrait (devrait) être gardée pour être rejouée la prochaine fois ! Pourquoi ne pourrait-elle pas être enregistrée, pour que je gagne du temps plus tard? Et pour être publié avec mon code, dans un format plus standard (phpunit, simpletest) ? On aurait ainsi une méthode simple pour capter des tests unitaires, et capitaliser sur cette masse immense de tests manuels, qui sont perdus après chaque exécution.

- Testing PHP with the interactive shell
- Screencast: Interactive Console for CakePHP
Les requêtes SQL préparées, aussi appelées commandes préparées, sont la panacée actuelle contre les injections SQL. Mais elles viennent avec un coût de performance assez important, un allongement du code PHP, et aussi, moins d'optimisation d'exécution. En effet, le plan d'exécution de la requête est calculé avant que les données ne soient connues, et cela empêche l'optimisateur d'utiliser certains index.

Lukas Smith propose alors de passer à l'émulation de commandes préparées, via PDO, pour avoir un système qui sépare l'exécution de l'analyse, mais en laissant la base de données traiter des requêtes complètes.

- Prepared statements gotcha
- Prepared statement gotchas

Commentaires

Ecrire

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours