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

var

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

5673 8 0
8个回答

walkor

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

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

  • var 2015-11-16

    哦哦 刚接触到protobuffer 说是比较省空间,效率高,就想着那个workerman的聊天的应用用protobuf来传输数据

ricky

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

  • 暂无评论
walkor

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

  • 暂无评论
qq646827911

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

  • walkor 2019-02-16

    快0.00001秒没有什么太大意义。另外最好压测下php的json 和 protobuffer到底哪个快,php下还真不一定protocol buffer比json快。

  • walkor 2019-02-16

    下面有脚本,先压测下到底快多少,再用也不迟。

walkor
<?php
$count = 1000000;
$data = ;

$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 = ;

$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居然慢了这么多,不科学呀,可能使用姿势不对

  • six 2019-03-22

    请问,你的这台机器 json_encode json_decode多少?

  • 国庆七天乐 2019-03-22

    @1393:ubuntu@DESKTOP-Q7K4DU0 ~/Desktop/myFirstGame $ php test_json.php
    1535519/S

walkor

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

  • 暂无评论
wsc218

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

  • walkor 2019-08-30

    新问题请发新的帖子。配合上详细的代码和结果截图,不然无法定位

年代过于久远,无法发表回答
🔝