2010-08-13 4 views
3

Je veux exécuter less et des programmes similaires à partir de la ligne de commande en PHP.Exécuter "less" à partir de la ligne de commande PHP w/Scrolling

J'ai essayé les suspects habituels (exec, shell_exec, passthru, etc), et tandis que beaucoup d'entre eux peuvent vider le fichier à l'écran, le processus est terminé avant que je puisse l'utiliser. Si je voulais cat, je l'utiliserais.

Comment exécuter un programme de cette manière?

+0

Voulez-vous interagir avec la console à partir d'un script PHP dans un navigateur? –

+0

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

Répondre

2

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); 
    } 
} 
+0

Bon concept, et moins de simulation de base pourrait être le chemin à parcourir (ou retravailler le tout dans Bash). La dernière partie de la réponse combinée avec de la sauce ncurses pourrait être le truc. – Grayside

0

Je ne crois pas que ce soit possible. PHP n'est pas un environnement VM/shell, les commandes dont il a besoin pour accéder à d'autres programmes lui renvoient le contrôle, et normalement il n'y a pas d'interaction pendant l'exécution de PHP. Une dernière chose, essayez avec les opérateurs backtick, si cela ne fonctionne pas, je suis sûr que vous ne pouvez pas le faire sans écrire quelque chose vous-même qui va dormir et permettre l'entrée de l'utilisateur etc ... par défaut pas

`nano file.txt` 
+0

L'a fait. Ne fonctionne pas – Grayside

0

Ajout exec (« stty cbreak »); au script PHP résout également le problème.

Je mets ce qui suit dans un fichier défini par le paramètre auto_prepend_file dans php.ini

Alors, je ferais quelque chose comme php.ini modifier à ce qui suit:

auto_prepend_file = /path/to/prepend.php 

Puis, dans,/chemin/vers/prepend.php, je voudrais ajouter la ligne suivante:

if (php_sapi_name() == 'cli') exec('stty cbreak'); 

Je ne suis pas sûr de la cause. J'ai lu des rapports de bogue pour PHP. Cependant, je ne suis pas sûr des versions. J'ai remarqué le problème avec la configuration suivante:

$ php -v 
PHP 5.3.3 (cli) (built: Jul 12 2013 20:35:47) 
Copyright (c) 1997-2010 The PHP Group 
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies 

Cependant, ce qui suit ne montre pas la question:

# php -v 
PHP 5.3.26 (cli) (built: Oct 21 2013 16:50:03) 
Copyright (c) 1997-2013 The PHP Group 
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies 
    with the ionCube PHP Loader v4.4.1, Copyright (c) 2002-2013, by ionCube Ltd. 

Il convient de noter que la version sans problème utilisait cPanel et l'autre en utilisant l'installation par défaut de CentOS 6 via yum.

Questions connexes