2008-09-24 2 views
6

Speziell ich habe ein PHP-Befehlszeilenskript, das zu einem bestimmten Zeitpunkt eine Eingabe vom Benutzer erfordert. Ich möchte in der Lage sein, einen externen Editor (wie vi) auszuführen, und warten, bis der Editor die Ausführung beendet, bevor das Skript fortgesetzt wird.Wie kann ich ein PHP-Skript in einen externen Editor umwandeln und danach zurückgeben?

Meine Grundidee war, eine temporäre Datei zu verwenden, um die Bearbeitung durchzuführen und den Inhalt der Datei danach abzurufen. Etwas entlang der Linien von:

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

get_user_input ($filename); 

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

Ich vermute, dass diese aus einer PHP-Befehlszeilenskript nicht möglich ist, aber ich hoffe, dass es irgendeine Art von Shell-Skripten Trick, der verwendet werden kann, das gleiche zu erreichen bewirken.

Vorschläge, wie dies in anderen Skriptsprachen erreicht werden kann, sind ebenfalls mehr als willkommen.

Antwort

9

Sie den Ausgang des Editor zum Terminal umleiten:

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

Ich kann nicht glauben, dass das so einfach war. – Evert

+0

OMG, so einfach. Vielen Dank! – marcio

2

ich das gerade versucht, und es funktioniert in den Fenstern in Ordnung, so dass Sie wahrscheinlich mit vi oder was auch immer Anwendung, die Sie wollen auf Linux replizieren kann.

Der Schlüssel ist, dass exec() hängt den PHP-Prozess während Notepad (in diesem Fall) ausgeführt wird.

<?php 

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

?> 

$ php -r test.php 

Edit: Wie Ihr Versuch zeigt und bstark, Brände mein Notizblock Test wies darauf hin, bis sich ein neues Fenster, so ist alles in Ordnung, aber jeder Editor, der im Konsolenmodus läuft schlägt fehl, da es keine Klemme zu befestigen ist.

Das gesagt, ich habe versucht, eine Linux-Box mit exec('nano test'); echo file_get_contents('test'); und es ist nicht so schlecht wie vi, es läuft nur ohne Anzeige von nichts. Ich könnte ein paar Sachen schreiben, "ctrl-X, y" drücken, um die Datei zu schließen und zu speichern, und dann fuhr das PHP-Skript fort und zeigte an, was ich geschrieben hatte. Wie auch immer .. Ich fand die richtige Lösung, so dass neue Antwort hereinkommt.

0

Ich weiß nicht, ob es überhaupt möglich ist, vi an das Terminal anzuschließen, auf dem PHP läuft, aber die schnelle und einfache Lösung ist nicht zu benutzen ein Bildschirmeditor am selben Terminal.

Sie können entweder einen Zeileneditor wie ed verwenden (das wollen Sie wahrscheinlich nicht) oder ein neues Fenster öffnen, wie system ("xterm -e vi") (ersetzen Sie xterm durch den Namen Ihrer Terminal-App) .

Bearbeitet, um hinzuzufügen: In Perl, System ("vi") funktioniert einfach, weil Perl nicht die Art von Phantasie Pipelining/Pufferung Php macht.

0

So scheint es Ihre Idee, eine Datei uns zu schreiben, führen verrückte Dinge zu versuchen, während es eine einfache Lösung ist :)

<?php 

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

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

Die fread() Aufruf wird der PHP-Prozess hängen, bis es etwas empfängt (1024 Bytes oder am Ende der Linie glaube ich), die Herstellung dieses:

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

Sicher, du kannst das tun, aber es ist nicht genau das, wonach ich gesucht habe. Mein Punkt war, dass ich die Flexibilität eines externen Editors wie vi oder ähnlichem wollte. –

+0

Okay, tut mir leid, ich dachte, du hättest diese Idee nur als Hack für Benutzereingaben erfunden, jedenfalls ist es klar, dass ich sehe. – Seldaek

Verwandte Themen