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()函数支持。
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
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
直接下载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 内容如下
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