2008-09-24 10 views
6

W szczególności mam skrypt wiersza poleceń PHP, który w pewnym momencie wymaga danych wejściowych od użytkownika. Chciałbym móc wykonać zewnętrzny edytor (na przykład vi) i poczekać, aż edytor zakończy wykonywanie przed wznowieniem skryptu.Jak mogę uciec skrypt PHP do zewnętrznego edytora, a następnie wrócić?

Moją podstawową ideą było użycie pliku tymczasowego do edycji w celu późniejszego pobrania zawartości pliku. Coś wzdłuż linii:

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

get_user_input ($filename); 

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

Podejrzewam, że nie jest to możliwe ze skryptu wiersza polecenia PHP, jednak mam nadzieję, że jest jakiś podstęp skryptów powłoki, które mogą być wykorzystane do osiągnięcia takie same efekt.

Sugestie, w jaki sposób można to osiągnąć w innych językach skryptowych, są również mile widziane.

Odpowiedz

9

można przekierować wyjście do redakcji do terminala:

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

Nie mogę uwierzyć, że to było takie proste. – Evert

+0

OMG, takie proste. Dziękuję Ci! – marcio

2

Właśnie próbowałem i to działa dobrze w oknach, więc prawdopodobnie można replikować z VI lub dowolnej aplikacji, którą chcesz na Linuksie.

Kluczem jest to, że exec() zawiesza proces php, podczas gdy notatnik (w tym przypadku) jest uruchomiony.

<?php 

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

?> 

$ php -r test.php 

Edit: Jak wasze pokazy próba i bstark wskazał, moi pożary testowe schowek się nowe okno, więc wszystko jest w porządku, ale każdy wydawca, który działa w trybie konsoli nie działa, ponieważ nie ma on dołączyć do terminalu.

Powiedziawszy to, próbowałem na Linux-ie z exec('nano test'); echo file_get_contents('test'); i nie zawodzi tak źle jak vi, działa tylko bez wyświetlania czegokolwiek. Mógłbym napisać kilka rzeczy, nacisnąć "ctrl-X, y", aby zamknąć i zapisać plik, a następnie skrypt php kontynuował i wyświetlał to, co napisałem. W każdym razie .. Znalazłem odpowiednie rozwiązanie, więc nowa odpowiedź nadchodzi.

0

Nie wiem, czy jest to w ogóle możliwe, aby połączyć się z vi do terminalu php, ale szybkie i łatwe rozwiązanie nie ma zastosowania edytor ekranu na tym samym terminalu.

Możesz użyć edytora liniowego, takiego jak ed (prawdopodobnie tego nie chcesz) lub otworzyć nowe okno, takie jak system ("xterm-e vi") (zastąp xterm nazwą aplikacji terminalu) .

Edytowane w celu dodania: W perlu system ("vi") po prostu działa, ponieważ perl nie robi takiego fantazyjnego potoku pipelining/buffing.

0

Wydaje się więc Twój pomysł zapisywania pliku prowadzą nas do spróbować szalone rzeczy, podczas gdy nie jest łatwym rozwiązaniem :)

<?php 

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

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

fread() wezwanie zawiesi proces php, dopóki nie otrzyma coś (1024 bajtów lub koniec linii myślę), tworząc w ten sposób:

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

Oczywiście, możesz to zrobić, ale nie jest to dokładnie to, czego szukałem. Chodzi mi o to, że chciałem elastyczności zewnętrznego edytora jak vi lub podobnego. –

+0

W porządku, przepraszam, myślałem, że właśnie wpadłeś na ten pomysł jako hack, by uzyskać dane od użytkownika, i tak jest ustalone, widzę. – Seldaek

Powiązane problemy