Tema: Re: proc_open velniava
Autorius: Justas Butkus
Data: 2010-02-25 00:38:42
Čia, sakyčiau, toks susitarimas, kad spustelėjus Enter (ne! Tai 
nelaikytina ASCII(10), tai gali būti laikoma kontrolinė komanda perduoti 
valdymą) prasideda kitas apdorojimas.
Nesu tikras, shell'as, man, tai vieta, kur gyvena magija. :)

php://stdin
<-- siūlau į tą patį $pipes[0], ar dar kur, pabandyti atsidaryti (fopen) 
šitai.
Nors šiaip nežinau, ar veiks, nes širdis sako (o kodą žiūrėti tingiu), 
kad fifo failų pagrindu tai gali veikti.
Iš kitos pusės, except'ionai Windows'uose, neleidžiantys turėti 
aukštesnių nei 3 lygmens pipe'ų kelia abejonių...


Kitas variantas - rankomis daugiau pasidarbuoti.
Pvz.: posix_mkfifo leidžia tuos named pipe'us kurtis pačiam.
Tiesa, darbelio jį apdorojant ir/ar perduodant veiksmus tolesniam 
procesui bus ne taip ir mažai.


Trečias variantas - kas tai per procesas vis tik?
Nes šitaip:
<?php
// file_name: vykdytojas.php
$pipesSpec = array(0 => array("pipe", "r"), 1 => array("pipe", "w"),
                    2 => array("pipe", "r"));

$proc = proc_open('php -f skaitytojas.php', $pipesSpec, $pipes);

fwrite($pipes[0], 'Eilutė pirma' . PHP_EOL);
$output = fgets($pipes[1], 128); echo $output;

fwrite($pipes[0], 'Eilutė antra' . PHP_EOL);
$output = fgets($pipes[1], 128); echo $output;

fwrite($pipes[0], 'gana' . PHP_EOL);
$output = fgets($pipes[1], 128); echo $output;

proc_close($proc);
?>
<?php
// file_name: skaitytojas.php
<?php
$line = '';
$fh = fopen('php://stdin', 'r');
while(1) {
     $line = ;
     echo 'Gavau: ' . trim(fgets($fh, 128)) . PHP_EOL;
}
fclose($fh);
return 0;
?>

Pakvietus 'php -f vykdytojas.php' veikia bendravimas.


--
JB

2010.02.24 11:29, flegmatoid rašė:
> na SSH'o atveju subeldus komanda ir spustelejus enter ("\n"), grazinamas
> output'as, kuri as esu linkes pamatyti. As taip pat esu linkes testi
> konmandu ivedima.
>
> Gi - pavyzdyje matyti, kad ta outputa as galiu gauti tik vienu budu -
> uzdares pipe'a i kuri tas outputas paseriamas - t.y. nupjoves saka ant
> kurios sedziu.
>
> Dar vienas klausimas prie to pacio - faktas kad procesas vis dar sukasi
> (proc_open yra elementarus fork'as) - gal kokiu nors subtiliu budu galima
> vel prisipe'inti prie jo? Tik va, $pipes[0] po uzdarymo yra NULL :\