Запись данных с помощью функции fwrite атомарно - PullRequest
0 голосов
/ 23 мая 2019

Я использую библиотеку WorkerMan для отправки данных клиентам через веб-сокеты. У меня есть код, который отправляет данные в Worker по протоколу TCP:

$instance = stream_socket_client('tcp://mysitedomain.com:5000');
$message_text = json_encode($message);
fwrite($instance,  $message_text. "\n");

Код моего получателя:

$receiver_worker= new \Workerman\Worker('tcp://mysitedomain.com:5000');
$receiver_worker->transport = 'ssl';
$receiver_worker->onMessage = function($connection, $data) {

Worker::log($data);
$data_json = json_decode($data, TRUE);

//here I process the $data

}

Моя проблема в том, что когда $ message_text слишком велик, я получаю не одно сообщение, а два или более. Причина описана в fwrite документации по функциям:

Запись в сетевой поток может закончиться до того, как будет записана вся строка. Возвращаемое значение fwrite () может быть проверено:

И это предложение:

function fwrite_stream($fp, $string) {
    for ($written = 0; $written < strlen($string); $written += $fwrite) {
        $fwrite = fwrite($fp, substr($string, $written));
        if ($fwrite === false) {
            return $written;
        }
    }
    return $written;
}

Но я не знаю, как это может мне помочь. Я могу обработать полученный JSON только атомарно и должен быть уверен, что весь JSON получен, но не некоторые части.

...