[PHP]Pipes en vertraagde in- en output

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Thralas
  • Registratie: December 2002
  • Laatst online: 21:34
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.

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).

Acties:
  • 0 Henk 'm!

  • Thralas
  • Registratie: December 2002
  • Laatst online: 21:34
Subtiel schopje.

Acties:
  • 0 Henk 'm!

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 01-04 08:48
Hoe gebruik je fwrite, stream_get_contents en fread?

Acties:
  • 0 Henk 'm!

  • Eijkb
  • Registratie: Februari 2003
  • Laatst online: 13-06 09:41

Eijkb

Zo.

Als iemand op de dedicated source server chat, hoe komt dat bericht dan uiteindelijk in de STDIN terecht? Leest het uit de console logging ofzo? Wellicht zit daar een vertraging. Normaliter zou je moeten werken met een trigger (vanuit Source in dit geval) die het script activeert, maar met PHP is dat wellicht lastig.

.


Acties:
  • 0 Henk 'm!

  • Thralas
  • Registratie: December 2002
  • Laatst online: 21:34
EnsconcE schreef op maandag 11 december 2006 @ 10:16:
Hoe gebruik je fwrite, stream_get_contents en fread?
De output van de server wordt uitgelezen door een loopje, aan de hand van de output wordt er dan eventueel data naar de stdin van dat proces geschreven.

PHP:
1
2
3
while($sm->proc()) {    
    usleep(50);
}


En proc() komt eigenlijk neer op

PHP:
1
2
3
4
5
6
7
8
9
10
while (1) {
    $ret = fread($this->pipes[PIPE_STDOUT], 8192);
    if($ret == FALSE || feof($this->pipes[PIPE_STDOUT])) {
        break;
    } else {
        $this->buffer .= $ret;
        unset($ret);
    }
}
//$this->buffer .= stream_get_contents($this->pipes[PIPE_STDOUT]);


Die feof() en unset() zijn eigenlijk niet nodig, maar dat is eringeslopen tijdens het testen met die brakke pipe.

stream_get_contents is nu commented out, maar daarmee werkte het eerder ook niet naar behoren.

Schrijven gebeurt dmv
PHP:
1
fwrite($this->pipes[PIPE_STDIN], sprintf("%s\n", $text));

Ik heb dit ook geprobeerd met een nutteloze(?) fflush()
vEijk schreef op maandag 11 december 2006 @ 10:20:
Als iemand op de dedicated source server chat, hoe komt dat bericht dan uiteindelijk in de STDIN terecht? Leest het uit de console logging ofzo? Wellicht zit daar een vertraging. Normaliter zou je moeten werken met een trigger (vanuit Source in dit geval) die het script activeert, maar met PHP is dat wellicht lastig.
Ja de source (The Ship in dit geval) output chatmessages normaliter meteen naar de console. Dit zou moeten worden uitgelezen.