Gitlib Gitlib
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)

Ravior

以梦为马,莫负韶华
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)
  • PHP

    • PHP-FPM使用指南
    • PHP7新特性总结
    • PHP安全编程
    • PHP安全配置总结
    • PHP变量的值类型和引用类型
    • PHP标准规范PSR
    • PHP操作Zookeeper实践
    • PHP错误和异常处理机制详解
    • PHP的Session运行机制
    • PHP底层运行机制和原理
    • PHP反射模拟实现注解路由
    • PHP高级用法总结
    • PHP开发常用文档总结
    • PHP开发入门:Memcached扩展安装
    • PHP开发入门:PHP7安装部署
    • PHP开发入门:Redis扩展安装
    • PHP开发SPL总结
    • PHP框架常见URL模式
    • PHP扩展开发入门
    • PHP垃圾回收机制
    • PHP类的自动加载
    • PHP输入输出流
    • PHP微服务开发指南
    • PHP协程
    • PHP写时拷贝技术
    • PHP性能优化之Opcache
    • PHP依赖注入和控制反转
    • PHP运行模式(SAPI)
    • PHP中file_get_contents与curl区别
    • RPC的简单实现
    • Protobuf:高效数据结构化工具
      • Protoc安装
      • 定义消息类型
      • 序列化/反序列化
    • P3P协议详解
    • Laravel之集合(Collection)总结
    • Laravel实践总结
    • Laravel之ORM总结
    • 中高级PHP实践总结
    • PHP Socket编程实战
  • Golang

  • Python

  • Javascript

  • 其他语言

  • 编程语言
  • PHP
Ravior
2015-03-12
目录

Protobuf:高效数据结构化工具

protobuf

在上一篇文章, 基于PHP的socket实现了简单的RPC功能。但是在开发过程中,由于TCP的长连接和频繁数据包传输, 一般都会对数据进行压缩。

Protobuf是Google开源的一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。具备以下特点:

  • 语言无关、平台无关,支持 Java、C++、Python、PHP等多种语言,支持多个平台;
  • 数据量小,解析速度快,比XML数据格式快20~100倍,比JSON快5~10倍;

在RPC开发中,多用Protobuf来作为数据交换协议,例如著名的rpc框架:gRPC

protobuf的使用很简单,按照一定的语法定义结构化的消息格式,然后用自带的编译工具(protoc),将自动生成对应语言相关的类.

# Protoc安装

在使用protobuf之前,我们需要依据protobuf结构化语法定义结构化文件,再使用protoc将结构化文件生成各种语言的类。

Git:https://github.com/protocolbuffers/protobuf (opens new window)

Doc:https://developers.google.com/protocol-buffers/docs/proto3 (opens new window)

先安装protoc:

sudo apt-get install libtool 
# 下载安装包
wget https://github.com/protocolbuffers/protobuf/archive/master.zip
unzip master.zip
cd protobuf-master

./autogen.sh
# 配置编译参数
./configure --prefix=/usr/local/protobuf
# 编译
make
# 安装
sudo make install
1
2
3
4
5
6
7
8
9
10
11
12
13

可以将protobuf安装路径protoc所在的目录,加入到环境变量中,便于我们快速调用protoc命令。

# Protobuf
export PATH=$PATH:/usr/local/protobuf/bin
1
2

# 定义消息类型

以官方文档为例,先定义一个Person消息类型

syntax = "proto3";

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
  }

  PhoneNumber phone = 4;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

protobuf

进行protoc编译,生成对应的php类:

protoc --php_out=./ person.proto
1

编译后目录结构:

protobuf

# 序列化/反序列化

我们需用composer引用google/protobuf库来调用protobuf:

编写composer.json:

{
	"name": "php-protobuf",
	"description": "PHP Protobuf Test",
	"keywords": ["protobuf"],
	"license": "MIT",
	"type": "project",
	"require":{
		"google/protobuf":"3.9.0"
	}
}
1
2
3
4
5
6
7
8
9
10

安装依赖包:composer install

protobuf

编写代码,测试序列化/反序列化:

<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

require('./vendor/autoload.php');

require('./GPBMetadata/Person.php');
require('./Person/PhoneNumber.php');
require('./Person/PhoneType.php');
require('./Person.php');

$person = new Person();
$person->setId(1);
$person->setName("gitlib");

$phone = new \Person\PhoneNumber();
$phone->setNumber('123456');
$phone->setType(\Person\PhoneType::HOME);

$person->setPhone($phone);
$data = $person->serializeToString();

var_dump($data);

$person2 = new Person();
$person2->mergeFromString($data);
var_dump("id:".$person2->getId()." name:".$person2->getName()." phone num:".$person2->getPhone()->getNumber());

?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

运行结果:

protobuf


本文更新于:2019年6月,修改采用proto3和php7。

#PHP#RPC
上次更新: 2022/12/01, 11:09:34
RPC的简单实现
P3P协议详解

← RPC的简单实现 P3P协议详解→

最近更新
01
常用游戏反外挂技术总结
11-27
02
Golang开发实践万字总结
11-11
03
Redis万字总结
10-30
更多文章>
Theme by Vdoing | Copyright © 2011-2022 Ravior | 粤ICP备17060229号-3 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式