php安装 protobuf扩展

前言

年轻之时,刚接触数据库就有一直思考一个问题:要是数据量巨大对于数据的存储以及解读有没有什么神器可以助我一臂之力。长大后知道了,原来google家有一开源神器叫protobuf。刚知道的时候俺还是属于懵逼状态。这是啥?有什么好处?要怎么安装?要怎么用?,这篇文章主要就回答这几个问题。

基于自己也是查过很多的资料,大多资料都是copy来copy去,无可奈何,只好自己动手总结一下。

protobuf是什么,怎么来的?

简单的说就是干和xml一样的事,把某种数据结构的信息,以某种格式保存起来。主要用于数据存储、传输协议格式等场合。

专业的解答: 
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

有同学就问了,那不是已经有xml了还造轮子搞个protobuf干啥?。

根本原因还是:xml性能不好啊。

1.时间维度:xml格式化(序列化)的开销倒还好;但是XML解析(反序列化)的开销就呵呵了。 
2.空间维度:XML格式为了有较好的可读性,引入了一些冗余的文本信息,所以空间开销也不是太好。

这对于大牛众多的google不能忍啊。必须搞一个不管是性能还是都优于xml的。

protobuf有什么好处?

1.对于数据结构的序列化反序列化等性能均优于xml 
2.代码生成机制,使用起来十分方便(后续会提到) 
3.明星项目有使用:据了解 google、新浪、美拍等均有使用protobuf,所以搬到项目使用肯定不会错。

protobuf如何安装?

本文所写的安装方法,是根据当前最新的安装包进行安装讲解的

准备资源: 
protobuf-2.6.1安装包 
php的protobuf扩展包

安装protobuf

wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz

tar zxvf protobuf-2.6.1.tar.gz

cd protobuf-2.6.1/

./configure --prefix=/usr/local/protobuf

make && make install

export PATH=/usr/local/protobuf/bin:$PATH

protoc --version

注意此处的包不能乱下载网上现成的。必须要大于2.5版本的。原因:最新版的protobuf代码生成机制要求必须大于2.5版本

安装php的protobuf扩展

wget https://github.com/allegro/php-protobuf/archive/master.zip

unzip master.zip

cd php-protobuf-master

yum install php-devel(安装依赖)

phpize

./configure --with-php-config=/usr/local/php/bin/php-config 

make && make install

//然后在php.ini里面加一下extension = "protobuf.so",再重启php与nginx即可。

安装composer

cd /path/to/you/../php-protobuf-master (存放php-protobuf-master的文件夹)

curl -s http://getcomposer.org/installer | php

php composer.phar install

protobuf如何使用?

1.代码生成机制:生成proto文件

vim cbstest.proto
  •  
message Person {
    required string name = 1;
    required int32 id = 2;
    optional string email = 3;
    optional double money = 4;
}

然后执行

php ./php-protobuf-master/protoc-gen-php.php cbstest.proto

然后就会形成一个 Person.php 的文件。

<?php
/**
 * Auto generated from test.proto at 2016-09-06 21:37:46
 */

namespace {
/**
 * Person message
 */
class Person extends \ProtobufMessage
{
    /* Field index constants */
    const NAME = 1;
    const ID = 2;
    const EMAIL = 3;
    const MONEY = 4;

    /* @var array Field descriptors */
    protected static $fields = array(
        self::NAME => array(
            'name' => 'name',
            'required' => true,
            'type' => \ProtobufMessage::PB_TYPE_STRING,
        ),
...省略...
}

这里会继承ProtobufMessage类,它是在protobuf.so中自动加载的

php实战的用法

对于俺这样非大神的人还是更关注实际的用法,如下:

$foo = new Person();
$foo->setName('hellojammy');
$foo->setId(2);
$foo->setEmail('helloxxx@foxmail.com');
$foo->setMoney(1988894.995);
$packed = $foo->serializeToString();

以上packed就是序列化后的结果,可直接存于数据库中。


$p = new Person();
$p->parseFromString($packed);
echo $p->getName() ."\n";
echo $p->getEmail() ."\n";
echo $p->getMoney() ."\n";
echo $p->getId() . "\n";

以上用于数据的反序列化。

有同学就问了,这也叫实战的例子?看过去好low,那是由于没有封装成函数的缘故。函数版如下,可直接添加到生成的文件的类底下。

public function encode($data){
    $fields = $this->fields();
    foreach ($fields as $key => $_item) {
        $field_name = $_item['name'];
        if(isset($data[$field_name])) {
            $this->set($key, $data[$field_name]);
        }
    }

    try {
        $packed = $this->serializeToString();
    } catch (\Exception $ex) {
        $data['fields'] = $fields;
        $data['error']  = $ex->getMessage();
        writeLog($data, 'encode_new_pb_failed');
        $packed = '';
    }

    return $packed;
}

public function decode($packed){
    try {
        $this->parseFromString($packed);

    } catch (\Exception $ex) {
        writeLog($ex->getMessage(), 'decode_new_pb_failed');
    }

    $data = array();
    $fields = $this->fields();
    foreach ($fields as $key => $_item) {
        $field_name = $_item['name'];
        $data[$field_name] = $this->get($key);
    }

    return $data;
}

从此可以愉快的使用protobuf了。

附录:

protobuf的githab 
protobuf的版本资源

转载自:https://blog.csdn.net/u011957758/article/details/52455231

Protobuf (Protocol Buffers) 是一种用于序列化结构化数据的语言无关、平台无关、可扩展的数据交换格式。它可以用于不同语言之间的通信,提供了高效、简洁和类型安全的数据交换方式。 在 PHP 中使用 Protobuf,可以通过安装 protobuf 扩展来实现。以下是一些使用 Protobuf 的基本步骤: 1. 首先,确保你的系统上已经安装Protocol Buffers 编译器(protoc)。你可以从官方网站下载并安装它。 2. 接下来,你需要在 PHP安装 protobuf 扩展。你可以通过使用 PECL 包管理器来安装扩展,运行以下命令: ``` pecl install protobuf ``` 3. 安装成功后,你需要在 PHP 配置文件中启用 protobuf 扩展。在 php.ini 文件中添加以下行: ``` extension=protobuf.so ``` 4. 然后,你需要定义你的数据结构并编写 .proto 文件。这个文件描述了数据的结构和字段。例如,假设你要定义一个消息类型为 MyMessage,并有一个字段为 name,可以创建一个名为 my_message.proto 的文件,内容如下: ``` syntax = "proto3"; message MyMessage { string name = 1; } ``` 5. 接下来,使用 protoc 编译器将 .proto 文件编译成 PHP 类文件。运行以下命令: ``` protoc --php_out=path/to/output/directory my_message.proto ``` 这将生成一个名为 MyMessage.phpPHP 类文件。 6. 最后,你可以在 PHP 代码中使用生成的类来序列化和反序列化数据。例如,下面是一个简单的示例: ``` <?php require_once 'path/to/output/directory/MyMessage.php'; $message = new MyMessage(); $message->setName('John'); // 序列化消息 $serialized = $message->serializeToString(); // 反序列化消息 $deserialized = new MyMessage(); $deserialized->mergeFromString($serialized); echo $deserialized->getName(); // 输出 "John" ?> ``` 这只是一个简单的示例,你可以根据自己的需求定义更复杂的数据结构和操作。更多关于 Protobuf 的详细信息可以参考官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值