我使用库WorkerMan通过WebSocket向客户端发送数据。 我有一个代码,可通过tcp协议将数据发送到Worker:
$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,但不能接收到某些部分。