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这样基于内存的 ...
随机推荐
- 简单的dp(dp专题)
题目链接:https://vjudge.net/contest/216347#problem/C Alice gets two sequences A and B. A easy problem ...
- Solr7.x介绍安装和配置(单机版)
之前学的是4.x,然后一看官网,奶奶的都7.x了.于是查了一番资料..... 1)下载和安装 wget http://mirror.bit.edu.cn/apache/lucene/solr/7.3. ...
- Oracle11G的用户解锁、卸载以及基础操作
Oracle用户解锁 [以下操作,必须以超级管理员身份登录,才能修改]oracle安装后,会默认生成很多个用户 以超级管理员身份登录,请注意,其中的空格符:[ sys是一个超级管理员,有最大的权限,d ...
- java中方法体的作用
java中抽象类中可以存在的抽象方法或接口中的方法不允许有方法体,但不属于方法体是空的.java.awt.event包中的适配器类中方法体是空的. 从语法中说,没有方法体必须是空的这一要求,只要是非抽 ...
- 【php】
1 <?php $arr = [ 'a' => 'aaa', ]; $arr2 = $arr; $arr2['a'] = 'ccc'; print_r($arr); print_r($ar ...
- The sventh day
call it a day 是个相当古老的习惯用语,沿用至今已经有一百五十多年了,但是人民仍然常常用到她. call it a day 可不是“叫一天”的意思哦, 这里是收工的,下班的意思 I thi ...
- 学习日记---java
1.构造函数 构造函数:首字母大写:对象创建时,就会调用与之对应的构造函数,对对象进行初始化. 只调用一次. 一般函数:对象创建后,需要函数功能时才调用.可以多次调用.首字母小写. 构造函数--重载: ...
- Eucalyptus-利用镜像启动一个Windows Server 2008r2实例
1.前言 使用kvm制作Eucalyptus镜像(Windows Server 2008r2为例)——http://www.cnblogs.com/gis-luq/p/3990792.html 上一篇 ...
- 用C#来控制高级安全Windows防火墙
有的时候我们需要在自己的产品中检测<高级安全Windows防火墙>的状态,并有可能需要加入一些规则甚至需要关闭掉高级安全Windows防火墙. 下面就告诉如何来做: <高级安全Win ...
- centos7.4 安装后的基本设置
centos7.4 安装后的基本设置 设置主机名称 设置IP地址,网关 修改网卡名称 内核优化 系统安全设置 防火墙设置 ssh设置 同步系统时间 安装基础软件包 软件配置 设置主机名称 hostna ...