路人(luren.com)的成哥说gearman是个好东西,于是我研究了下,结合nodejs与php写了一个简单的数据推送demo。
gearman相当于一个任务分发的角色,以服务器的形式运行,接受客户端添加任务的请求,然后把任务分发给worker端,让worker去执行相应的任务。更多信息可以去看下官网的介绍。
gearman的特色就是支持很多编程语言,不同语言安装相应的gearman扩展,都可以写代码直接与gearman服务器通信,可以用来做为跨语言沟通的工具。
OK,我做的这个DEMO的功能非常简单,就是有用户请求php页面,php页面就发一个工作请求给gearman,再用nodejs做为工作端,当gearman服务器接收到任务时,就把任务分派给nodejs执行。nodejs执行部分就是将内容推送出去。最后在html页面上用js代码连接socket.io,实现实时消息推送的呈现。最终效果就是,当有用户访问client.php时,在html页面chat.html就是实时显示用户的IP地址。
下面来实现。
第一步:安装环境
我的系统环境为ubuntu 12.04。安装apache与php与nodejs就不用说了。
安装gearman:
sudo apt-get install gearman
编译安装php的gearman扩展:
sudo apt-get install libgearman6 libgearman-dev wget http://pecl.php.net/get/gearman-0.8.3.tgz tar zvxf gearman-0.8.3.tgz cd gearman-0.8.3/ phpize ./configure make sudo make install
然后在php.ini 中加入:
extension=gearman.so
然后重启apache。
第二步:client端PHP代码
php端添加任务 client.php:
<?php
$client= new GearmanClient();
$client->addServer("127.0.0.1", 4730);
//$client->do('sendmsg', $_SERVER['REMOTE_ADDR']); //用do的话会等待gearman server返回,如果不存在worker,则会卡死在等待那里
$client->doBackground('sendmsg', $_SERVER['REMOTE_ADDR']); //不等待返回,后台执行
?>
第三步:workder端nodejs代码
工作任务交给node.js完成,worker.js:
var Gearnode = require("gearnode");
var io = require('socket.io').listen(8000);
io.set('browser client minification', true); //最小化js
io.sockets.on('connection', function(socket){
socket.on('chat', function(data){
socket.broadcast.emit('chat', {
'msg': data
});
});
});
worker = new Gearnode();
worker.addServer(); // use localhost
worker.addFunction("sendmsg", "utf-8", function(payload, job){
var response = payload.toUpperCase();
io.sockets.emit('chat', {'msg':response});
job.complete(response);
});
第四步:呈现实时数据的html端
最后,html前端要呈现nodejs推送过来的数据 chat.html关键代码:
<script type="text/javascript" src="http://hichenming.com:8000/socket.io/socket.io.js"></script>
var socket = io.connect('http://hichenming.com:8000');
socket.on('chat', function(data) {
$("p#data_recieved").append("
\r\n" + '用户IP: ' + data.msg);
$("p#log").html('最新用户IP:' + data.msg);
});
最后一步:运行代码啦
运行上面的nodejs代码先要安装node包:
npm install gearnode npm install nodejs
运行gearman服务器吧:
gearmand -d
然后运行我们写好的nodejs:
nohup node server.js & #还有一个更好的守护运行方式 forever(https://github.com/nodejitsu/forever.git) #sudo npm install forever -g #forever start -l forever.log -o out.log -e err.log server.js
这样只要一访问client.php,就会有推送到chat.html啦,chat.html实时显示访问用户的IP地址。
DEMO地址:https://kyle.ai/gearman-demo/chat.html