proc_open
Exécute une commande et ouvre les pointeurs de fichiers pour les entrées sorties
Descriptionresourceproc_openstringcmdarraydescriptorspecarraypipesproc_open est similaire à popen
mais fournit un plus grand degré de contrôle sur l'exécution du programme.
cmd est la commande qui doit être exécutée par le shell.
descriptorspec est un tableau indexé, dont les clés
représentent le numéro de descripteur et la valeur la méthode
avec laquelle &php; va passer ce descripteur au processus fils.
pipes recevra un tableau indexé de pointeurs de
fichiers qui correspondent aux sorties dans &php; de tous les pipes
qui sont créés. La valeur retournée est une ressource qui représente le
processus. Il faudra la détuire avec la fonction proc_close
lorsque vous aurez fini.
Exemple avec proc_open
array("pipe", "r"), // stdin est un pipe où le processus va lire
1 => array("pipe", "w"), // stdout est un pipe où le processus va écrire
2 => array("file", "/tmp/error-output.txt", "a"), // stderr est un fichier
);
$process = proc_open("php", $descriptorspec, $pipes);
if (is_resource($process)) {
// $pipes ressemble à :
// 0 => fichier accessible en écriture, connecté à l'entrée standard du processus fils
// 1 => fichier accessible en lecture, connecté à la sortie standard du processus fils
// Toute erreur sera ajoutée au fichier /tmp/error-output.txt
fwrite($pipes[0], "");
fclose($pipes[0]);
while(!feof($pipes[1])) {
echo fgets($pipes[1], 1024);
}
fclose($pipes[1]);
// Il est important que vous fermiez les pipes avant d'appeler
// proc_close() afin d'éviter un verrouillage.
$return_value = proc_close($process);
echo "La commande a retourné $return_value\n";
}
?>
]]>
&php; 5RC2 introduit le suppport pty pour les systèmes avec Unix98 ptys.
Cela permet à votre script d'interagir avec des applications qui
s'attendent à dialoguer avec un terminal. Un pty fonctionne comme un pipe,
mais est bi-directionnel : il n'y a pas besoin de spécifier de mode lecture
ou écriture. L'exemple ci-dessous montre comment utiliser un pty. Notez
que tous les pointeurs de fichier ne doivent pas ncéessairement dialoguer
avec le pty. Notez aussi que seul un pty est créé, même si pty est
spécifié 3 fois. Dans les futures versions de &php; il sera possible de faire
plus que simplement lire et écrire dans un pty.
array("pty"),
1 => array("pty"),
2 => array("pty")
);
$process = proc_open("cvs -d:pserver:cvsread@cvs.php.net:/repository login", $descriptorspec, $pipes);
if (is_resource($process)) {
// Travaille sur la documentation PHP ici
}
?>
]]>
Les numéros de descripteurs de fichiers de descriptorspec
ne sont pas limités à 0, 1 et 2 : vous pouvez spécifier n'importe quel
numéro de descripteur valide, et il sera passé au processus fils. Cela
permettra à votre script d'inter opérer avec d'autres scripts, et d'être
exécuté comme "co-processus". En particulier, c'est très pratique pour
passer des mots de passes à des programmes comme PGP, GPG et openssl,
avec une méthode très protégée. C'est aussi pratique pour lire des
informations de statut fournies par ces programmes, sur des descripteurs
auxiliaires.
Compatibilité Windows : les descripteurs au-dela de 2 (stderr) sont
accessibles au processus fils, sous la forme de pointeurs héritables, mais
comme l'architecture Windows n'associe pas de nombre aux descripteurs
de bas niveau, le processus fils n'a (actuellement) aucun moyen
d'y accéder. Stdin, stdout et stderr fonctionnent comme d'habitude.
Si vous n'avez besoin que d'un processus uni-directionnel,
popen sera plus pratique, car plus simple à
utiliser.
Voir aussi
stream_select,
exec,
system,
passthru,
popen,
escapeshellcmd et
les opérateurs backtick.