2008-09-24 12 views
6

Plus précisément, j'ai un script de ligne de commande PHP qui, à un certain point, nécessite une entrée de l'utilisateur. J'aimerais pouvoir exécuter un éditeur externe (tel que vi), et attendre que l'éditeur termine l'exécution avant de reprendre le script.Comment échapper un script PHP à un éditeur externe et revenir ensuite?

Mon idée de base était d'utiliser un fichier temporaire pour faire l'édition, et de récupérer le contenu du fichier par la suite. Quelque chose le long des lignes de:

$filename = '/tmp/script_' . time() . '.tmp'; 

get_user_input ($filename); 

$input = file_get_contents ($filename); 
unlink ($filename); 

Je soupçonne que ce n'est pas possible à partir d'un script de ligne de commande PHP, mais j'espère qu'il ya une sorte de truc de script shell qui peut être utilisé pour obtenir le même effet.

Des suggestions sur la manière d'y parvenir dans d'autres langages de script sont également les bienvenues.

Répondre

9

Vous pouvez rediriger vers la borne de sortie de l'éditeur:

system("vim > `tty`"); 
+2

Je ne peux pas croire que c'était si facile. – Evert

+0

OMG, si facile. Je vous remercie! – marcio

2

Je viens essayé et il fonctionne très bien dans les fenêtres, de sorte que vous pouvez probablement répliquer avec vi ou quelle que soit l'application que vous voulez sur Linux.

La clé est que exec() bloque le processus PHP alors que le bloc-notes (dans ce cas) est en cours d'exécution.

<?php 

exec('notepad c:\test'); 
echo file_get_contents('c:\test'); 

?> 

$ php -r test.php 

Edit: Comme votre montre tentative et bstark signalé, mes tirs d'essai notepad une nouvelle fenêtre si tout va bien, mais tout éditeur qui fonctionne en mode console échoue, car il n'a pas de terminal à attacher. Cela étant dit, j'ai essayé sur une machine Linux avec exec('nano test'); echo file_get_contents('test'); et il ne manque pas aussi mal que vi, il fonctionne juste sans rien afficher. Je pourrais taper quelques trucs, appuyer sur "ctrl-X, y" pour fermer et enregistrer le fichier, puis le script PHP a continué et affiché ce que j'avais écrit. Quoi qu'il en soit .. J'ai trouvé la bonne solution, donc une nouvelle réponse à venir.

0

Je ne sais pas si c'est tout possible de se connecter vi au terminal php fonctionne, mais la solution rapide et facile est de ne pas utiliser un éditeur d'écran sur le même terminal. Vous pouvez soit utiliser un éditeur de ligne comme ed (vous ne voulez probablement pas cela) ou ouvrir une nouvelle fenêtre, comme system ("xterm -e vi") (remplacer xterm par le nom de votre application de terminal) .

Edité pour ajouter: En perl, system ("vi") fonctionne simplement, car perl ne fait pas le genre de pipelining/buffering fantaisie fait.

0

Il semble que votre idée d'écrire un fichier nous conduire à essayer des choses folles alors qu'il ya une solution facile :)

<?php 

$out = fopen('php://stdout', 'w+'); 
$in = fopen('php://stdin', 'r+'); 

fwrite($out, "foo?\n"); 
$var = fread($in, 1024); 
echo strtoupper($var); 

L'appel fread() va suspendre le processus de php jusqu'à ce qu'il reçoive quelque chose (1024 octets ou fin de ligne, je pense), la production de ce:

$ php test.php 
foo? 
bar <= my input 
BAR 
+0

Bien sûr, vous pouvez le faire, mais ce n'est pas exactement ce que je recherchais. Mon point était que je voulais la flexibilité d'un éditeur externe comme vi ou similaire. –

+0

D'accord alors désolé je pensais que vous venez de proposer cette idée comme un hack pour obtenir des commentaires de l'utilisateur, de toute façon c'est réglé je vois. – Seldaek