Autor | Zpráva | ||
---|---|---|---|
ehlo_f1re Profil * |
Zdravim,
hledám způsob jak spustit script z PHP a realtimově zpracovávat nové řádky na výstupu. Příklad pseudokódu: spustit_script_se_zpracovanim_novych_radku("/cesta/ke/skriptu.sh", "nazev_funkce_zpracovavajici_nove_radky"); function nazev_funkce_zpracovavajici_nove_radky($radek){ zpracuj_nejak($radek); } Zapoměl jsem to ujasnit. V PHP pseudokódu tedy požaduji, aby se "sledovalo" jestli na výstupu /cesta/ke/skriptu.sh neobjevil nový řádek. Pokud ano, tak se npř. spustí funkce nazev_funkce_zpracovavajici_nove_radky a jako argument jí bude předán nový řádek. Neví tedy někdo prosím jak to udělat? Nějaký hint? Díky za odpovědi! |
||
MartinP_ Profil * |
#2 · Zasláno: 14. 12. 2015, 18:40:58
Co na to použít nějaký jiný jazyk, než PHP? V jiných jazycích, které nespouštějí nový proces při každém požadavku můžeš sledovat výstup stdoutu a podle toho posílat data na websocket. Je to práce na pár řádků.
Jestli to ale chceš v PHP, musel bys program spustit na pozadí a výstup přesměrovat do souboru nebo fifo (pojmenovaná roura) a pak pomocí časovače přečíst řádek, zpracovat ho a odeslat klientovi. <?php if(!prikaz_bezi()) { // zkontroluje např. existenci fifo souboru apod. posix_mkfifo("./roura", 0644); // vytvori rouru exec("prikaz > ./roura &"); // spustí příkaz, stdout přesměruje do vytvořené roury } $fd = fopen("./roura", "r"); stream_set_timeout($fd, 1); // bude cekat max 1s na radek z programu, pak selze $radek = fgets($fd); fclose($fd); if($radek) echo $radek; ?> Tento PHP skript budeš volat AJAXem z časovače, při prvním spuštění spustí program na pozadí a pak bude postupně vracet řádky výpisu. Zkoušel jsem to, ale ještě to chce vyladit, protože to některé řádky přeskakuje. |
||
ehlo_f1re Profil * |
#3 · Zasláno: 14. 12. 2015, 18:49:51
Časovač a ajax použít nechci. :)
Zatim to také vidím na jiný jazyk pro tuto část. Ale bylo by pěkné to mít celé v PHP. |
||
MartinP Profil * |
#4 · Zasláno: 14. 12. 2015, 18:53:05
Můžeš také program rovnou přesměrovat do php:
./soubor.sh | php zpravuj.php; # toto můžeš dát klidně do exec() v jiném PHP skriptu zpracuj.php: <?php $fd = fopen("php://stdin", "r"); while($radek = fgets($fd)) { zpracuj($radek); } ?> |
||
Alphard_ Profil * |
#5 · Zasláno: 14. 12. 2015, 18:54:59
Na tohle se používá proc_open().
|
||
ehlo_f1re Profil * |
#6 · Zasláno: 14. 12. 2015, 21:06:29
Toto mi funguje zatím perfektně.
$pip = popen($cmd, "r"); while( $line = fgets($pip) ){ echo $line; delej_neco_s_radkem($line); } |
||
Časová prodleva: 8 let
|
0