[转]PHP 下使用 ZeroMQ 和 protobuf
FROM : http://www.68idc.cn/help/makewebs/php/20150118175432.html
前言
这个记录总的来说分两部分:
- 搭建环境。
- 简单使用教程。
搭建环境
安装 ZeroMQ 库
首先 PHP 很早之前就安装了, 所以我不想选择重新编译 PHP , 而是想用动态加载模块的方法来添加这个库。
正好 zmermq 的官网介绍的有,于是我学会了动态给php安装库。
不过安装 php 版本的 zmq 模块之前, 需要有 c++ 版本的 zmw 库。
于是先安装 c++ 版本的库。
wget http://download.zeromq.org/zeromq-4.0.5.tar.gz
tar zxvf zeromq-4.0.5.tar.gz
cd zeromq-4.0.5.tar.gz
./configure
make
make test
make install
安装 php ZeroMQ 模块
然后安装 php 版本的模块, 和普通安装只多了一步: phpize
下载地址在 github 上
git clone git://github.com/mkoppanen/php-zmq.git
unzip php-zmq-master.zip
cd php-zmq-master
phpize
./configure
make -B
make test
make install
Build complete 问题
# ./configure
config.status: creating config.h
config.status: config.h is unchanged
# make
Build complete.
Don't forget to run 'make test'.
这个可以看上面的两个代码的区别。
由于 make 的时候就只编译有修改的文件链, 而我们的文件什么也没有修改, 所以不会重新编译。
这个时候就要使用 make -B
强制重新编译了。
ZMQContext not found 问题
大概错误如下
Fatal error: Class 'ZMQContext' not found ( but it is installed and works on the terminal )
stackoverflow 上找到三个类似的问题 这里, 这里, 还有这里 stackoverflow3.
他们的大概结论就是配置文件的问题。
而且他们提示命令行可以正常执行的,于是我尝试在命令行试试,结果真的可以的。
php test.php
#正常输出结果
而且 他们都是强调php有两个配置文件, 一个是 命令行使用的, 一个是 apache 使用的, 但是我使用 whereis php
找到有 php 的地方, 然后去看, 只有 /etc/php.ini
这一个地方有。
# whereis php
php: /usr/bin/php /etc/php.d /etc/php.ini /usr/lib64/php /usr/include/php /usr/local/php /usr/share/php /usr/share/man/man1/php.1.gz
于是我猜想:最大的可能就是 apache 没有使用 /etc/php.ini
这个配置文件。
但是当时我想着命令行能用,就先用命令行吧。
先让整个客户端能够运行起来在说,于是我不管这个问题了。(最后还需要面对这个问题,并找到原因解决了,详见下面)
安装 protobuf 库
protobuf 在 google 的官网上没有找到 php 版本的源码, 只在 github 上找到两个, 我选择了 这个。
然后下载安装
git clone https://github.com/allegro/php-protobuf/archive/master.zip
unzip php-protobuf-master.zip
cd php-protobuf-master
phpize
./configure
make
make test
make install
然后命令行可以正常运行了。
简单实用记录
php 下 zmq 的使用
由于我只是在 php 下作为客户端链接其他地方的服务端, 这里只记录客户端的使用方法。
看下面的代码之前可以先看看之前我记录的一篇 ZMQ 简单记录。
语言是相同的,所以理解了一个语言,其他语言很快也能上手的。
// 创建环境
$context = new ZMQContext();
//创建 socket
$requester = new ZMQSocket($context, ZMQ::SOCKET_REQ);
//连接服务端, 如果是服务端,只需要改成 bind , 以及 socket 的第二个参数修改一下就行了吧。
$requester->connect("tcp://10.12.191.112:5555");
//发送数据
$requester->send("hello");
//接受数据
$ret = $requester->recv();
//处理数据
dump($ret);
php 下 protobuf 的使用
首先编写自己的协议,比如简单的登陆协议, 保存为 proto 后缀的文件,比如 test.proto .
package test;
message api_req
{
required string username = 1;
required string password = 2;
}
message api_rsp
{
required int32 ret = 1; // 0 通过验证 1 拒绝验证
required string err_msg = 2; //错误信息
}
然后使用 protoc-php.php 对我们的协议进行转换
这个 protoc-php.php 文件在上面我说的 github 上可以找到, ProtobufCompiler 也要下载的。
php protoc-php.php test.proto
执行完之后会输出一个 php 的文件, 里面是用 php 封装好的我们的协议类。
最后就是使用我们的协议类了。
//引入我们的头文件
require_once 'pb_proto_test.php';
//对我们的数据进行打包,并返回字符串
$req = new Test_ApiReq();
$req->setUsername($username);
$req->setPassword($password);
$packed = $req->serializeToString();
//对得到的字符串进行解包
$rsp= new Test_ApiRsp();
try {
$rsp->parseFromString($packed);
} catch (Exception $ex) {
die('Upss.. there is a bug in this example');
}
$ret = $rsp->getRet();
$msg = $rsp->getErrMsg();
遗留问题
最终, php 下的 zeromq 和 protobuf 都可以正常运行了, 只不过是在命令行下运行的。
然后我无意间看到有人说配置文件不对, 编译库的时候需要指定 php-config 。
于是我尝试了一下
cd php-zmq-master
/usr/local/php/bin/phpize
./configure -with-php-config=/usr/local/php/bin/php-config
make -B
make test
make install
然后浏览器中竟然没有 提示找不到 ZMQContext
了。
但是出现了新的问题, 提示: 找不到 ProtobufMessage。
于是使用相同的方法对 protobuf 进行编译。
cd php-protobuf-master
/usr/local/php/bin/phpize
./configure -with-php-config=/usr/local/php/bin/php-config
make -B
make test
make install
good, 没有提示找不到 ProtobufMessage 了。
但是提示 undefined symbol: zend_new_interned_string in Unknown on line 0
.
于是我开始大量的查询资料了。
第一个是这里 和 这里, 但是我这模块不是通过 pecl 安装的,所以无效。
但是我还是执行了 php -v
这个参数,提示我是 5.3.3 版本的 php.
然后我又在这里 和 这里, 没有解决问题。
但是它提示我查看 phpinfo 这个倒是需要做一下。
然后我发现我的 php 版本是 5.6 .
此时我意识到一个问题: 我的这台开发机上安装了有两个 php 程序。
当然,我起初搜到这里, 这里, 还有这里,还有这里,大家都说是 bug, 现在看来不是 bug 了。
解决方案
既然确定是有两个 php 版本的缘故, 那就需要先把版本保持一致再说。
于是我采用比较暴力的方法, 把 /usr/local/php/bin/
里的文件复制一份到 /etc/bin/
下面。
当然,覆盖前先把原先的文件备份一下。
ls /usr/local/php/bin/
pear peardev pecl phar phar.phar php php-cgi php-config phpize
cp /usr/local/php/bin/* /etc/bin/*
这样不需要指定路径再重新编译一下, 重启 apache, 浏览器访问发现可以正常返回结果了。
总结
出现这些问题了, 先确认是不是配置文件的问题, 不是了再确认是不是版本的原因。
《完》
[转]PHP 下使用 ZeroMQ 和 protobuf的更多相关文章
- 在Windows QT下使用ZeroMQ
zeroMQ作为一个嵌入式消息队列系统,以其轻便灵活的使用方式,极为适合应用程序分布式通讯处理, 或者是一种有效的代替常规saocket通讯的方法. 1)下载地址:http://zeromq.org/ ...
- C#语言下使用gRPC、protobuf(Google Protocol Buffers)实现文件传输
初识gRPC还是一位做JAVA的同事在项目中用到了它,为了C#的客户端程序和java的服务器程序进行通信和数据交换,当时还是对方编译成C#,我直接调用. 后来,自己下来做了C#版本gRPC编写,搜了很 ...
- Linux下安装protobuf并实现简单的客户端服务器端通信
http://code.google.com/p/protobuf/downloads/list上可以下载Protobuf的源代码. 安装步骤如下所示: 1>tar -xzf protobuf- ...
- Linux下zeromq.js安装
本文章主要阐述在离线环境下安装zeromq.js的方法和步骤.zeromq.js下载地址: https://www.npmjs.com/package/zeromq或者 https://github. ...
- 在Wcf中应用ProtoBuf替代默认的序列化器
Google的ProtoBuf序列化器性能的牛逼已经有目共睹了,可以把它应用到Socket通讯,队列,Wcf中,身为dotnet程序员一边期待着不久后Grpc对dotnet core的支持更期待着Wc ...
- windows下使用vs进行Proctocol Buffer开发(C++篇)
因工作原因接触Proctocol Buffer(protobuf),至于什么是protobuf,为何使用protobuf,我就不赘述了,百度下都是答案. 今天我介绍的是在windows下使用vs进行p ...
- google protobuf使用
下载的是github上的:https://github.com/google/protobuf If you get the source from github, you need to gener ...
- linux zeromq
本人在centos下安装zeromq 1.下载最新版的zeromq http://download.zeromq.org/ 2 解压 tar -xvf zeromq-3.1.0-beta.tar.gz ...
- protobuf使用NDK编译Android的静态库(工作记录)
1.protobuf 编译过程 前提: 确保自己电脑上已经安装了cygwin + ndk, 并且NDK能够编译hello-jni成功 1.1 把protobuf 压缩包解压到protobuf文件夹下 ...
随机推荐
- IIS与Apache共用80端口方法
IIS与Apache共用80端口 http://www.cnblogs.com/haocool/p/3595282.html Windows server 2003服务器上安装有默认 IIS 6和Ap ...
- php示例代码之读取文件
php读取文件 1 2 3 4 5 6 7 8 $sourceString=''; $fp = @fopen($filename, "r"); while($line = ...
- Java中怎样创建线程安全的方法
面试问题: 下面的方法是否线程安全?怎样让它成为线程安全的方法? class MyCounter { private static int counter = 0; public static int ...
- Java Security:Java加密框架(JCA)简要说明
加密服务总是关联到一个特定的算法或类型,它既提供了密码操作(如Digital Signature或MessageDigest),生成或供应所需的加密材料(Key或Parameters)加密操作,也会以 ...
- Sql Server之旅——第十三站 对锁的初步认识
终于这个系列快结束了,马上又要过年了,没什么心情写博客...作为一个开发人员,锁机制也是我们程序员必须掌握的东西,很久之前 在学习锁的时候,都是教科书上怎么说,然后我怎么背,缺少一个工具让我们眼见为实 ...
- 使用VIM插件ctags来阅读C代码
说明 Ctags是vim下方便代码阅读的工具.尽管ctags也可以支持其它编辑器,但是它正式支持的只有vim.并且vim中已经默认安装ctags,它可以帮助程序员很容易地浏览源代码:ctags最先是用 ...
- Android ImageView(scaleType属性)(转)
(转自:http://www.open-open.com/lib/view/open1378257991687.html) <ImageView android:id="@+id/im ...
- C语言链表中数组实现数据选择排序,升序、降序功能主要难点
链表排序讲解: head指针指向链表的头结点,是找到整个链表的唯一依据,如果head指针丢失,整个链表就找不到了. head存储的是第一个节点的地址,head->next存储的是第二个节点的地址 ...
- scp报错:not a regular file,解决方法:加参数 -r
命令:scp -P1234 /data/aa root@192.0.0..0:/data 文件结构:/data/aa/yearmonth=2015-09 报错:not a regular fi ...
- LNMP环境搭建
LNMP环境搭建 Linux + Nginx + MySQL + PHP PHP是一种脚本语言,当前中国乃至世界上使用PHP语言开发的网站非常普遍 Nginx是一个web服务软件,和apache是一类 ...