@walkor 大大 workerman中的传输协议可以使用protobuffer吗

如果可以的话,客户端websocket那里接受到返回数据,如何来解析序列化的数据呢
已邀请:

walkor

赞同来自:

workerman可以用protobuffer,客户端如何解析protobuffer这个要看什么客户端,一般去protobuffer主页下载个对应的库就行了。

另外既然用websocket协议了,就没必要用protobuffer了,不知道你在websocket协议上传输protobuffer的初衷是什么?

ricky

赞同来自:

protobuf的序列化和反序列化不错啊。在websocket上难道不需要用这个吗?

walkor

赞同来自:

在websocket上传输json更通用一些,调试也更方便一些。

qq646827911

赞同来自:

用protocol buffer  跟快啊,所以想在wm使用

walkor

赞同来自:

<?php
$count = 1000000;
$data = [
'a' => 'a',
'b' => 'b',
'c' => 'c',
];

$time_start = microtime(true);

for ($i=$count; $i>0; $i--) {
$json = json_encode($data);
$tmp = json_decode($json);
}

echo ceil($count/(microtime(true)-$time_start)), "/S\n";

我的笔记本上执行结果为 1125994/S,也就是执行一次 json_encode+json_decode 大概耗时0.0000009秒,这个速度大多数情况下足够用了,从速度上讲没必要过度优化。
如果有兴趣可以压测下protocol buffer看下速度有多快,欢迎将对比结果贴在下面。

国庆七天乐

赞同来自:

<?php
require_once __DIR__ . '/vendor/autoload.php';


$count = 1000000;
$data = [
'a' => 'a',
'b' => 'b',
'c' => 'c',
];

$time_start = microtime(true);
$test = new \Protocols\Test();

$encode = function ($data) use ($test)
{
$test->setData($data);
return $test->serializeToString();
};

$decode = function ($bin_data) use ($test)
{
$test->mergeFromString($bin_data);
return $test->getData();
};

for ($i=$count; $i>0; $i--) {
$bin_data = $encode($data);
$tmp = $decode($bin_data);
}

echo ceil($count/(microtime(true)-$time_start)), "/S\n";
                                                            ubuntu@DESKTOP-Q7K4DU0 ~/Desktop/myFirstGame $ protoc --version     
libprotoc 3.6.0
ubuntu@DESKTOP-Q7K4DU0 ~/Desktop/myFirstGame $ php test_protobuf.php
626678/S
ubuntu@DESKTOP-Q7K4DU0 ~/Desktop/myFirstGame $ 
protobuf居然慢了这么多,不科学呀,可能使用姿势不对

walkor

赞同来自:

这么看来php下protobuf不一定比json快

wsc218

赞同来自:

如果是客户端js传输protobuffer 二进制流数据的话,workerman中websocket协议下如何接收呢?官方的例子是$connection->websocketType = Websocket::BINARY_TYPE_ARRAYBUFFER,打印结果部分显示,但是数据流原样返回,客户端js解析后却是空的,若主动推二进制流数据给客户端能解析出数据来,这说明数据在接收时就不完整了,如何能获得完整的二进制流数据呢

要回复问题请先登录注册