Я использую библиотеку 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 получен, но не некоторые части.