5
« 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:
#!/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:
$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:
echo fread($pipes[1], 1024);
Když ale budu číst malé bloky, tak pokud čtu více, než kolik zbejvá, tak se to kousne:
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í:
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:
echo fread($pipes[1], 1024);
echo fread($pipes[2], 1024);
ani jen
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í.