路人(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