protobuf php的使用,关于php:PHP使用protobuf
在Ubuntu18.04与PHP7.2.24环境,安装protocv3.13.0.1和PHPprotobuf扩展,编译.proto文件生成PHP类,配置Composer自动加载,实现序列化与反序列化,用于对接头条DMP数据包。
服务器环境为 Ubuntu 18.04.5 LTS,PHP 7.2.24,今天我们来梳理一下 protobuf 的安装与 PHP 扩展的集成过程。这套流程在实际项目中很常见,尤其是需要对接头条 DMP 数据包时,会用到 protobuf 的序列化与反序列化。下面直接进入正题。
安装 protoc(v3.13.0.1)
首先,获取 protobuf 的源码包。这里用的是截至 2020 年 10 月 14 日的 v3.13.0.1 版本:
wget https://codeload.github.com/protocolbuffers/protobuf/tar.gz/v3.13.0.1
下载完成后解压:
tar zxvf v3.13.0.1
cd protobuf-3.13.0.1
接下来生成 configure 脚本:
./autogen.sh
然后编译安装,指定安装路径为 /usr/local/protobuf:
./configure --prefix=/usr/local/protobuf
make && make install
安装完成后,需要将 protoc 加入全局路径,方便后续调用:
export PATH=/usr/local/protobuf/bin:$PATH
验证是否成功,执行:
protoc --version
如果输出 libprotoc 3.13.0,说明安装成功。
安装 PHP protobuf 扩展
PHP 端需要借助 pecl 来安装 protobuf 扩展:
pecl install protobuf
安装完成后,将 extension=protobuf.so 添加到 php.ini 配置文件中。php.ini 的位置可以通过以下几种方式查看:
- CLI 模式下:
php --ini - 通过
phpinfo();函数查看 - 使用
ps -ef | grep php找到进程对应的配置文件
例如,在 /etc/php/7.2/fpm/php.ini 中追加该行。
生成 PHP 代码
在项目根目录下,执行以下命令将 .proto 文件编译为 PHP 类:
protoc --php_out="protobuf/compile" "protobuf/protos/DmpDataProto.proto"
编译后生成的目录结构如下:
├── compile
│ ├── GPBMetadata
│ │ └── Protobuf
│ │ └── Protos
│ │ └── DmpDataProto.php
│ └── Toutiao
│ └── Dmp
│ ├── DmpData.php
│ ├── IdItem_DataType.php
│ └── IdItem.php
└── protos
└── DmpDataProto.proto
添加 Composer 自动加载
项目中使用了 Composer,需要引入 Google 的 protobuf 库:
composer require google/protobuf:^3.3
然后在 composer.json 的 autoload 部分添加自动加载映射,让生成的类可以被正确加载:
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/",
"Toutiao\\": "protobuf/compile/Toutiao",
"GPBMetadata\\": "protobuf/compile/GPBMetadata/Protobuf/Protos"
}
},
之后执行 composer dump-autoload 刷新即可。
使用示例
序列化一行数据:
public function decodeOneLine($line)
{
$idItem = new \Toutiao\Dmp\IdItem();
$idItem->setDataType(\Toutiao\Dmp\IdItem_DataType::IMEI);
$idItem->setId(strtolower($line));
$idItem->setTags('IMEI');
$binaryString = $idItem->serializeToString();
return $binaryString;
}
反序列化一行数据:
public function decodeOneLine($line)
{
$item = new \Toutiao\Dmp\IdItem();
$item->mergeFromString($line);
return $item->getId();
}
这套流程主要是为了上传头条 DMP 包,不过头条那边用的是 protobuf 2,和当前版本略有差异,后续有空再深入看看。
未完待续
Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。
Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。
Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。
Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。















