PHP, zaseknuté čtení z proc_open

A. F.

PHP, zaseknuté čtení z proc_open
« kdy: 20. 07. 2019, 21:45:21 »
Ahoj. Mohl by mi prosím někdo vysvětlit následující chování?

Mám takovýto script:
Kód: [Vybrat]
#!/bin/env php
<?php
$count 
0;
while (
True) {
echo "<123456";
$str fgets(STDIN);
if (trim($str) == ':q') {
break;
}
fwrite(STDOUT"> $str\n");
fwrite(STDERR"(count: $count)\n");
$count++;
}

exit(
0);
A teď se pokouším tento script obsluhovat. Otevřu si process:
Kód: [Vybrat]
$process = proc_open('bin/readwrite.php', [
0 => array('pipe', 'r'),
1 => array('pipe', 'w'),
2 => array('pipe', 'w'),
], $pipes, __dir__);

tak, a teď mám takovýto problém:
První problém je, že když načtu velkej blok najednout, tak je to v pořádku:
Kód: [Vybrat]
echo fread($pipes[1], 1024);
Když ale budu číst malé bloky, tak pokud čtu více, než kolik zbejvá, tak se to kousne:
Kód: [Vybrat]
echo fread($pipes[1], 4);
echo fread($pipes[1], 4);
Chápu to tak, že u prvního volání může být velikost větší než požadovaná, ale u druhého si musím nejdřív zjistit, jestli nějaké zbývají pomocí:
Kód: [Vybrat]
stream_get_meta_data($pipes[1])['unread_bytes'];
a musí to být přesně.
A já se ptám, proč je to tak? Proč se to kousne?

Druhá otázka je k tomu, jak mám přečíst chybovej stream z dotyčného scriptu. Naivní pokus:
Kód: [Vybrat]
echo fread($pipes[1], 1024);
echo fread($pipes[2], 1024);
ani jen
Kód: [Vybrat]
echo fread($pipes[2], 1024);

mi nefunguje :-( Kousne se to, analogicky k předchozímu. Akorád že na velikosti bufferu nezáleží.

Pokud byste někdo věděl, tak díky za vysvětlení.