Ik probeer met behulp van PHP van en naar de STDIN en STDOUT van een console programma te schrijven. Hiervoor maak ik gebruik van proc_open() en de pipe-array reference die je mee kunt geven.
Hiernaast maak ik de pipes non-blocking om te voorkomen dat ik moet wachten op in- of output.
Met behulp van fwrite() en stream_get_contents() / fread() lees en schrijf ik naar de pipes. Dit werkt perfect, afgezien van het feit dat zowel input die ik wegschrijf, als output van het console programma waarnaar de pipes verwijzen vaak met een lange vertraging 'aankomen'. Waar het programma standalone meteen X regels output als je het opstart, duurt het een tijdje voordat de console output bij m'n script aankomt. Als voorbeeld (het betreft een dedicated source server): Als een speler op de server een chatmessage verstuurd, dan lijkt het af en toe pas 20 seconden later bij m'n script uit te komen. Ik call fread in een loop, dus het is niet zo dat het script die 20 seconden niets probeert te lezen.
Zowel getest op Debian 3.1 (PHP 5.20) als CentOS (onbekend).
PHP:
1
2
3
4
5
| define('PIPE_STDIN', 0); define('PIPE_STDOUT', 1); $descriptorspec = array(0 => array('pipe', 'r'), 1 => array('pipe', 'w')); $this->rs = proc_open($this->exec, $descriptorspec, $this->pipes); |
Hiernaast maak ik de pipes non-blocking om te voorkomen dat ik moet wachten op in- of output.
PHP:
1
2
3
| foreach($this->pipes as $p) { stream_set_blocking($p, 0); } |
Met behulp van fwrite() en stream_get_contents() / fread() lees en schrijf ik naar de pipes. Dit werkt perfect, afgezien van het feit dat zowel input die ik wegschrijf, als output van het console programma waarnaar de pipes verwijzen vaak met een lange vertraging 'aankomen'. Waar het programma standalone meteen X regels output als je het opstart, duurt het een tijdje voordat de console output bij m'n script aankomt. Als voorbeeld (het betreft een dedicated source server): Als een speler op de server een chatmessage verstuurd, dan lijkt het af en toe pas 20 seconden later bij m'n script uit te komen. Ik call fread in een loop, dus het is niet zo dat het script die 20 seconden niets probeert te lezen.
Zowel getest op Debian 3.1 (PHP 5.20) als CentOS (onbekend).