Gearman任务分配
Gearman 实现多数据库数据同步
测试环境:windows(mysql)+ 虚拟机(ubuntu + mysql)+ PHP
1:gearman 的官方文档可以了解gearman,在ubuntu中安装gearman :
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install gcc autoconf bison flex libtool make libboost-all-dev libcurl4-openssl-dev curl libevent-dev memcached uuid-dev libsqlite3-dev libmysqlclient-dev
2:下载gearman
wget https://launchpad.net/gearmand/1.2/1.1.5/+download/gearmand-1.1.5.tar.gz
3:解压安装:
tar xvzf gearmand-1.1.5.tar.gz
cd gearmand-1.1.5
./configure
make
make install
如有错误根据错误提示: sudo apt-get install ....等;
4: 通过pecl 安装gearman (默认你的ubuntu已经安装了php):
sudo apt-get install php-pear
sudo pecl install gearman
sudo gedit /etc/php5/cli/php.ini
在文件末尾添加 extension="gearman.so";
5: 终端输入: php --info | grep "gearman support" 出现gearman support => enabled 则表示成功!
6:启动gearmand:sudo gearmand -d &
注意:这时可能会报错:gearmand: Could not open log file "/var/log/gearmand.log", from "/home/cj", switching to stderr. (Permission denied)
解决方法:
mkdir -p /usr/local/var/log/
cd /usr/local/var/log/
touch gearmand.log
再次启动:gearmand,通过 ps -ef | grep gearmand 查看gearman的进程。
7:PHP测试(多服务器数据库数据同步)
(1)环境:主机windows中安装mysql,设置数据库登录名:cw 和密码 : cw123;
虚拟机ubuntu安装mysql,设置数据库登陆名:cu 和密码 :cu123。
在两个数据库中分别建一张表:fb_table(表名)。
(2)服务端:serverCJ.php:(内容)
<?php $worker = new GearmanWorker();
$worker->addServer("127.0.0.1",4730);
$worker->addServer("192.168.238.2",4730); $worker->addFunction('func1', function(GearmanJob $job){ $str = $job->workload();
$datas = json_decode($str,true); $key = $datas["key"];
$lang= $datas["lang"];
$texts = $datas["text"];
$kid = $datas["aid"]; $con = mysql_connect("192.168.238.2","cw","cw123");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
$sqls = "select count(1) from fb_table where albumkey='".$key."'";
$count = mysql_query($sqls,$mycon);
if($count>0){
$strSql="update fb_table set albumkey='$key',langcode='$lang',texts='$texts',albumid='$kid'";
}
else{
$strSql="insert into fb_table(albumkey,langcode,texts,albumid) values('$key','$lang','$texts','$kid')";
} $result=mysql_query($strSql,$mycon);
sleep(3);
return 'The user requested ('.$result.') is func1';
}); $worker->addFunction('func2', function(GearmanJob $job){
$str = $job->workload();
$datas = json_decode($str,true); $key = $datas["key"];
$lang= $datas["lang"];
$texts = $datas["text"];
$kid = $datas["aid"]; $con = mysql_connect("127.0.0.1","cu","cu123");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
$sqls = "select count(1) from fb_table where albumkey='".$key."'";
$count = mysql_query($sqls,$mycon);
if($count>0){
$strSql="update fb_table set albumkey='$key',langcode='$lang',texts='$texts',albumid='$kid'";
}
else{
$strSql="insert into fb_table(albumkey,langcode,texts,albumid) values('$key','$lang','$texts','$kid')";
} $result=mysql_query($strSql,$mycon); sleep(3);
return 'The user ('. $result .') is func2';
}); while ($worker->work());
(3) 客户端:clientCJ.php:(内容)
<?php $key =$_POST['key'];
$lang =$_POST['lang'];
$text=$_POST['textmsg'];
$aid =$_POST['aid']; $client = new GearmanClient();
$client->addServer("127.0.0.1",4730); $userInfo = $friends = null; $client->setCompleteCallback(function(GearmanTask $task, $context) use (&$userInfo, &$friends) {
switch($context) {
case func1
$userInfo = $task->data();
break;
case 'func2'
$friends = $task->data();
break;
}
}); $data=array("key"=>$key,"lang"=>$lang,"text"=>$text,"aid"=>$aid);
$datas=json_encode($data); $client->addTask('func1', $datas, 'func1');
$client->addTask('func2', $datas, 'func2'); echo "Fetching...\n";
$start = microtime(true);
$client->runTasks();
$totaltime = number_format(microtime(true) - $start, 2); echo "Got user info in: $totaltime seconds:\n";
var_dump($userInfo, $friends);
(4)请求页面:submit.html
<form action="./clientCJ.php" method="post">
<table>
<tr>
<td>
key:<input type="text" name="key" id="key" value="keys" />
langcode:<input type="text" name="lang" id="lang" value="zh" />
</td>
<td>
texts:<input type="text" name="texts" id="texts" value="textmsg" />
albumid:<input type="text" name="aid" id="aid" value="12"/>
</td>
</tr>
</table>
<input type="button" value="提交" onclick="submins()" />
</form>
注:在serverCJ中 $worker->addServer("192.168.238.2",4730); 的IP号为本机(windows的ip地址)即链接windows的数据库。
(5)运行:在终端输入 : php /**/serverCJ.php & (其中 **为serverCJ 的存放路径);运行服务端
在打开另一个终端,输入: php /**/clientCJ.php 运行客户端。
验证数据是否成功插入数据库:在ubuntu中进入数据库查询刚才新建的表 fb_table ,发现插入了一条数据,同样windows主机的数据库一样多了一条数据。!!
总结:实现了php运用gearman分别向两个服务器的数据库插入数据,实现数据同步。当然PHP同样能实现,但效率要慢得多。
Gearman任务分配的更多相关文章
- gearman参数说明
-b, –backlog=BACKLOG 连接请求队列的最大值 -d, –daemon Daemon 守护进程化 -f, –file-descriptors=FDS 可打开的文件描述符数量 -h, – ...
- MapReduce剖析笔记之五:Map与Reduce任务分配过程
在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体 ...
- gearman 安装
yum install gperfyum install libevent-develyum install libuuid-develwget https://launchpad.net/gearm ...
- Gearman使用示例
最近的一个旧项目重构过程中,使用到了gearman这个开源项目,简单来讲,这是一个类似MQ的异步系统,一边派发任务,一边处理任务(有类似MQ中的消息发送方与接收方),目前支持java,php等多种语言 ...
- mac机上搭建php56/nginx 1.8.x/thinkphp 3.2.x/gearman扩展/seaslog扩展/redis扩展环境
php的各种扩展配置起来实在不容易,记录一下备忘: 一.php56 安装 虽然php7出来了,但是没用过,不知道有没有坑,这里仍然使用php5.6版本 1.1 安装php/php-pfm brew u ...
- [Linux]使用PHP编写Gearman的Worker守护进程
在我之前的文章中,介绍过Gearman的使用.在我的项目中,我使用了PHP来编写一直运行的Worker.如果按照Gearman官方推荐的例子,只是简单的一个循环来等待任务,会有一些问题,包括:1.当代 ...
- hihoCoder 1309:任务分配 贪心 优先队列
#1309 : 任务分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN, ...
- 用于PHP的Gearman Worker管理工具GearmanManager
项目地址:https://github.com/brianlmoon/GearmanManager PHP环境要求 PHP 5.5.9 POSIX extension Process Control ...
- 通过Gearman实现MySQL到Redis的数据同步
对于变化频率非常快的数据来说,如果还选择传统的静态缓存方式(Memocached.File System等)展示数据,可能在缓存的存取上会有很大的开销,并不能很好的满足需要,而Redis这样基于内存的 ...
随机推荐
- serv-U 7以上版本pasv端口的设置及中文乱码问题
利用serv-u架设ftp服务器已经是再常见不过了事情了,近日一朋友为图新鲜,弄了个7.4版本的新玩意儿,结果架设上去后,仅开了21端口,用LeapFtp在port模式下连接没问题,但是另一常见的cu ...
- FFmpeg编译i386 OSX 脚本
话不多说, 直接上脚本 #!/bin/sh # directories PLATFORM="OSX" # FFmpeg脚本目录 SOURCE="ffmpeg-2.8.7& ...
- LR C语言语句复习,几个简单代码
嵌套循环 Action() { int i,j; ;i<=;i++) { ) beark; else lr_output_message("i=%d",i); ;j<= ...
- 11个炫酷的 Linux 终端命令
我已经用了十年的Linux了,通过今天这篇文章我将向大家展示一系列的命令.工具和技巧,我希望一开始就有人告诉我这些,而不是曾在我成长道路上绊住我. 1.命令行日常系快捷键 如下的快捷方式非常有用,能够 ...
- ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第十一天(非原创)
文章大纲 一.课程介绍二.订单系统介绍三.项目源码与资料下载四.参考文章 一.课程介绍 一共14天课程(1)第一天:电商行业的背景.淘淘商城的介绍.搭建项目工程.Svn的使用.(2)第二天:框架的整合 ...
- 2 cmd中startup显示运行不了显示“不是内部或外部命令”
解决方案: 1 在C:\Windows\System32中检查cmd.exe是否存在(如果存在的话)(检查cmd.exe是否被误删) 2 在我的电脑——属性——环境变量——在系统变量找到Path编辑前 ...
- base、self标签
以新的窗口打开页面 self在自己的窗口打开
- VC使用编译时间作为版本号
常用方法分两步:1. 得到编译时间:2. 设置基准时间,以编译时间距基准时间的总天数的2倍作为版本号,适当情况还可加上初值: 其中第一步实现有两种方法: 1. 直接使用系统宏:CString OcxT ...
- C#中Dictionary泛型集合7种常见的用法
要使用Dictionary集合,需要导入C#泛型命名空间 System.Collections.Generic(程序集:mscorlib) Dictionary的描述1.从一组键(Key)到一组值( ...
- Cocos2d-x v3.1 坐标系统(五)
Cocos2d-x v3.1 坐标系统(五) 为了能够更好的布局以及了解对象所在的位置,我们必须对Cocos2d-x中的坐标有详细的了解,本篇文章主要就是了解Cocos中用到的坐标系统.学过数学的人都 ...