Raspberrypi Linux: 为php安装protobuf扩展

xiaoxiao2021-02-28  104

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,可以在下载, 或者中文官网也可以下载,但请下载较新版本的

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

    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

转载请注明原文地址: https://www.6miu.com/read-61075.html

最新回复(0)