Raspberrypi Linux: 为php安装protobuf扩展

Raspberrypi Linux: 为php安装protobuf扩展


    Protobuf为谷歌开源项目,用来序列化数据,在实际项目中应用非常广泛。我在树莓派上安装protobuf遇到不少坑,特此记录。

    如本文有不正确的地方还请指出,谢谢支持。

一、前提环境

    系统信息:Linux raspberrypi 4.9.24-v7+ #993 SMP Wed Apr 26 18:01:23 BST 2017 armv7l GNU/Linux

    系统已经预先安装php, 我是源码编译安装的php, 版本为5.5.38

    特别注意: 源码编译php的时候, 在配置中请加上 --enable-bcmath,protobuf php需要bcadd()函数支持。

  

二、安装protobuf

    1 先安装工具

    sudo apt-get install autoconf automake libtool curl make g++ unzip

    2 获取源码包

    https://github.com/google/protobuf           

    #这个编译会生成protoc可执行程序, 请参照https://github.com/google/protobuf/blob/master/src/README.md文档编译,在此就不再说明了

    https://github.com/allegro/php-protobuf    #这个编译php扩展, 即下文讲的源码

    3 将源码包上传到树莓派并解压到 /home/lighttpd/php-protobuf-master   (路径可以自己指定,后面的改成你自己的即可)
    4 进入源码路径

    cd  /home/lighttpd/php-protobuf-master

    5 将编译PHP生成的phpize可执行文件拷贝到当前路径, apt-get安装的也有这个文件,或者直接在终端检查有没有此命令

       若有就不需要执行此步骤

       如果是apt-get安装的php, 找不到phpize和php-config, 请先执行以下命令

       sudo apt-get install php5-dev

       然后查找php-config路径, 记下此路径,下一步备用

       sudo find / -name php-config

    6 进入源码路径php-protobuf-master, 执行以下命令
    ./phpize
    ./configure --with-php-config=/home/pi/webserver/php/build/x86/bin/php-config //此处路径为php安装路径下的php-config文件, 请改为自己的路径
    make
    make install
 
    7 看到以下内容即表示安装成功
     root@raspberrypi:/home/lighttpd/php-protobuf-master# make install
     Installing shared extensions:     /home/pi/webserver/php/build/x86/lib/php/extensions/no-debug-non-zts-20121212/
 
    8 查看版本:protoc --version

三,php加入protobuf扩展

    1 php开启模块支持, 打开php配置文件

    nano /home/pi/webserver/php/build/x86/lib/php.ini    //这是我的php.ini文件路径,请对照自己路径修改, nano和vim都是文本编辑器,也可以用vim
    加入此行,注意protobuf.so的路径即为前面第二节第7步安装成功后提示的路径
    extension=/home/pi/webserver/php/build/x86/lib/php/extensions/no-debug-non-zts-20121212/protobuf.so

    PS: 如果是apt-get安装的php, 

    sudo find / -name php.ini    #全局查找php.ini文件

    将找到的文件全部加上extension=.~~~~~/protobuf.so 这句话

    2 重启lighttpd服务器, 查看编写一个包含phpinfo()的脚本,浏览器访问, 检查有protobuf即OK

 


四,在php中使用protobuf 序列化数据(这部分是坑最多的)

    1   安装composer, 后面要用到这个管理工具, 网上查找的安装方式几乎都不能用, 绝大多数是因为被墙的原因。不过你要是能安装上,可直接略过下面步骤。

         直接下载composer.phar,可以在CSDN下载, 或者中文官网也可以下载,但请下载较新版本的

         附CSDN连接:http://download.csdn.net/detail/webben/9787171   点击 CSDN下载

    2  下载完成后上传到树莓派任意路径

    3   执行以下命令,直接全局使用,注意执行之前给composer.phar附加执行权限

         cp composer.phar /usr/local/bin/composer
 

    4  执行以下命令 修改composer源到中国镜像,并关闭http安全验证,然后安装

        cd /home/lighttpd/php-protobuf-master  //首先进入到之前安装protobuf的路径, 否则最后执行composer install会有问题,请对照自己路径操作

        composer config -g repo.packagist composer https://packagist.phpcomposer.com  
        composer config secure-http false
        composer install
 
    5  更新 composer , 
        cd /home/lighttpd/php-protobuf-master/  

       编辑composer.json,在require字段处加入如下行"google/protobuf": "^3.2"     //3.2 是使用protoc --version命令看到的版本号,请对应操作,
       {
           "require": {
           "google/protobuf": "^3.2"
       }

       如果忽略上述步骤, 会造成php无法找到对应的google头文件

       新建一个目录, (又是一个坑)

       mkdir /home/lighttpd/php-protobuf-master/vendor/google/protobuf

       composer update
       composer install    //重新安装
  

    6  拷贝步骤5生成的文件夹vendor 到网站php脚本目录, 或者任意php脚本能访问到的目录都行
        cp -r  vendor  /var/www/htdocs/php/


    7 新建一个简单的proto文件, 路径可以任意指定, 后续的换成你自己的即可

       nano /var/www/htdocs/php/protobuf/test.proto

       写入以下内容,保存退出

       syntax = "proto3";
       package config;
       message VoiceConfig{
          int32 sample_rate = 1;
          int32 mic_num = 2;
          string voiceserver_address = 3;
       }

     8 执行下面命令,

       /home/pi/webserver/php/build/x86/bin/php /home/lighttpd/php-protobuf-master/protoc-gen-php.php test.proto

      其中/home/pi/webserver/php/build/x86/bin/php是php可执行文件路径,如果有全局php命令直接使用php即可

      /home/lighttpd/php-protobuf-master/protoc-gen-php.php是第一节安装protobuf路径下的文件,请换成你的路径

     9 新建PHP脚本test.php 内容如下

 <?php
    error_reporting(E_ERROR | E_WARNING | E_PARSE);  //禁止打印错误和警告信息
    require_once('vendor/autoload.php');   //步骤四.6生成的文件路径内有此文件
    require_once('protobuf/GPBMetadata/Config.php');  //步骤四.8 生成的文件路径内有此文件

    include 'protobuf/Config/VoiceConfig.php';   //步骤四.8 生成的文件路径内有此文件

    $foo = new \Config\VoiceConfig();
    $foo->setSampleRate(1600);
    $foo->setMicNum(8);
    $foo->setVoiceserverAddress("192.168.0.136");

    //to encode message
    $packed = $foo->serializeToString();

    //to decode message
    $param2 = new \Config\VoiceConfig();
    $param2->mergeFromString($packed);


    $jsonArr = array("getSampleRate"=> $param2->getSampleRate(),
        "setMicNum"=> $param2->getMicNum(),
        "setVoiceserverAddress"=> $param2->getVoiceserverAddress(),
        );
    echo json_encode($jsonArr);
?> 


10 通过浏览器访问test.php, 看到如下打印即OK

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值