商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > protobuf php的使用,关于php:PHP使用protobuf

protobuf php的使用,关于php:PHP使用protobuf

  发布于2026-07-19 阅读(0)

扫一扫,手机访问

服务器环境为 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.jsonautoload 部分添加自动加载映射,让生成的类可以被正确加载:

"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,和当前版本略有差异,后续有空再深入看看。

未完待续

本文转载于:https://blog.csdn.net/weixin_32815027/article/details/115637899 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注