private function parser($ipcClient) : \Generator
{
$readWatcherId = yield;
$buffer = "";
$length = null;
do {
yield;
$data = @fread($ipcClient, 8192);
$buffer .= $data;
do {
if (!isset($length)) {
if (!isset($buffer[3])) {
break;
}
$length = unpack("Nlength", substr($buffer, 0, 4))["length"];
$buffer = substr($buffer, 4);
}
if (!isset($buffer[$length - 1])) {
break;
}
$message = substr($buffer, 0, $length);
$buffer = (string) substr($buffer, $length);
$length = null;
// all messages received from workers are sent to STDOUT
$this->console->output($message);
} while (1);
if ($data == "" && !is_resource($ipcClient) || @feof($ipcClient)) {
$this->onDeadIpcClient($readWatcherId, $ipcClient);
return;
}
} while (1);
}