利用gearman结合php与nodejs实现数据推送

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