Vous pouvez utiliser proc_open
pour alimenter entrée et obtenir une sortie de retour d'un processus par des tuyaux. Cependant, il ne semble pas que moins d'interaction de l'utilisateur soit possible via les canaux, car elle se dégrade fondamentalement en une commande cat
. Voici mon premier (échec) approche:
<?php
$dspec = array(
0 = array('pipe', 'r'), // pipe to child process's stdin
1 = array('pipe', 'w'), // pipe from child process's stdout
2 = array('file', 'error_log', 'a'), // stderr dumped to file
);
// run the external command
$proc = proc_open('less name_of_file_here', $dspec, $pipes, null, null);
if (is_resource($proc)) {
while (($cmd = readline('')) != 'q') {
// if the external command expects input, it will get it from us here
fwrite($pipes[0], $cmd);
fflush($pipes[0]);
// we can get the response from the external command here
echo fread($pipes[1], 1024);
}
fclose($pipes[0]);
fclose($pipes[1]);
echo proc_close($proc);
Je suppose que pour certaines commandes cette approche pourrait en fait travailler - et il y a des exemples dans le php manpage pour proc_open
qui pourrait être utile de regarder par-dessus - mais pour less
, vous récupérer le fichier entier et aucune possibilité d'interaction, peut-être pour des raisons mentionnées par la réponse de Viper_Sb.
... Mais il semble assez facile de simuler less
si c'est tout ce dont vous avez besoin. Par exemple, vous pouvez lire la sortie de la commande dans un tableau de lignes et alimenter en morceaux bouchées:
<?php
$pid = popen('cat name_of_file_here', 'r');
$buf = array();
while ($s = fgets($pid, 1024))
$buf[] = $s;
pclose($pid);
for ($i = 0; $i < count($buf)/25 && readline('more') != 'q'; $i++) {
for ($j = 0; $j < 25; $j++) {
echo array_shift($buf);
}
}
Voulez-vous interagir avec la console à partir d'un script PHP dans un navigateur? –
Aucun navigateur. Je veux juste lancer d'autres outils à partir de PHP, puis être réellement * dans * ces outils jusqu'à ce que je sorte. – Grayside