Domanda

In particolare ho uno script da riga di comando PHP che ad un certo punto richiede input da parte dell'utente. Mi piacerebbe essere in grado di eseguire un editor esterno (come vi) e attendere che l'editor termini la sua esecuzione prima di riprendere lo script.

La mia idea di base era quella di utilizzare un file temporaneo per eseguire la modifica e recuperare successivamente il contenuto del file. Qualcosa del genere:

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

get_user_input ($filename);

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

Sospetto che ciò non sia possibile da uno script da riga di comando PHP, tuttavia spero che ci sia una sorta di trucco di scripting della shell che può essere impiegato per ottenere lo stesso effetto.

Anche i suggerimenti su come ottenere questo risultato in altri linguaggi di scripting sono più che benvenuti.

È stato utile?

Soluzione

Puoi reindirizzare l'output dell'editor sul terminale:

system("vim > `tty`");

Altri suggerimenti

Ho appena provato questo e funziona benissimo in Windows, quindi probabilmente puoi replicare con vi o qualunque app tu voglia su Linux.

La chiave è che exec () blocca il processo php mentre il blocco note (in questo caso) è in esecuzione.

<?php

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

?>

$ php -r test.php

Modifica: come mostra il tuo tentativo e ha sottolineato bstark, il mio test del blocco note attiva una nuova finestra, quindi tutto va bene, ma qualsiasi editor che gira in modalità console fallisce perché non ha un terminale a cui collegarsi.

Detto questo, ho provato su un box Linux con exec ('nano test'); echo file_get_contents ('test'); e non funziona male come vi, funziona solo senza visualizzare nulla. Potrei digitare alcune cose, premere " ctrl-X, y " per chiudere e salvare il file, quindi lo script php ha continuato e visualizzato ciò che avevo scritto. Comunque .. ho trovato la soluzione giusta, quindi arriva una nuova risposta.

Non so se sia possibile connettere vi al terminale php sia in esecuzione, ma la soluzione semplice e veloce non è usare un editor di schermate sullo stesso terminale.

Puoi usare un editor di linee come ed (probabilmente non lo vuoi) o aprire una nuova finestra, come il sistema (" xterm -e vi ") (sostituisci xterm con il nome della tua app terminale) .

Modificato per aggiungere: in perl, il sistema (" vi ") funziona, perché perl non fa il tipo di pipeline / buffering di php che fa.

Quindi la tua idea di scrivere un file ci porta a provare cose folli mentre esiste una soluzione semplice :)

<?php

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

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

La chiamata fread () bloccherà il processo php fino a quando non riceve qualcosa (1024 byte o fine linea penso), producendo questo:

$ php test.php
foo?
bar <= my input
BAR
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top