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任务分配的更多相关文章

  1. gearman参数说明

    -b, –backlog=BACKLOG 连接请求队列的最大值 -d, –daemon Daemon 守护进程化 -f, –file-descriptors=FDS 可打开的文件描述符数量 -h, – ...

  2. MapReduce剖析笔记之五:Map与Reduce任务分配过程

    在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体 ...

  3. gearman 安装

    yum install gperfyum install libevent-develyum install libuuid-develwget https://launchpad.net/gearm ...

  4. Gearman使用示例

    最近的一个旧项目重构过程中,使用到了gearman这个开源项目,简单来讲,这是一个类似MQ的异步系统,一边派发任务,一边处理任务(有类似MQ中的消息发送方与接收方),目前支持java,php等多种语言 ...

  5. 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 ...

  6. [Linux]使用PHP编写Gearman的Worker守护进程

    在我之前的文章中,介绍过Gearman的使用.在我的项目中,我使用了PHP来编写一直运行的Worker.如果按照Gearman官方推荐的例子,只是简单的一个循环来等待任务,会有一些问题,包括:1.当代 ...

  7. hihoCoder 1309:任务分配 贪心 优先队列

    #1309 : 任务分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN,  ...

  8. 用于PHP的Gearman Worker管理工具GearmanManager

    项目地址:https://github.com/brianlmoon/GearmanManager PHP环境要求 PHP 5.5.9 POSIX extension Process Control ...

  9. 通过Gearman实现MySQL到Redis的数据同步

    对于变化频率非常快的数据来说,如果还选择传统的静态缓存方式(Memocached.File System等)展示数据,可能在缓存的存取上会有很大的开销,并不能很好的满足需要,而Redis这样基于内存的 ...

随机推荐

  1. WCF 内置绑定在不同的传输安全模式下的信道层

    basicHttpBinding Transport安全模式信道层 Message安全模式信道层 TransportWithMessageCredential安全模式信道层 TransportCred ...

  2. Android自定义控件练手——简单的时钟

    首先这应该是一个老生常谈的设计了,但是毕竟身为小白的自己都没动手做过,不动手怎么提高自己呢,所以在这梅林沉船闲暇之际,我就把我的设计流程与思路记录下来.首先来看看效果图吧: 如上图就是一个简单并没有美 ...

  3. COGS 1453. [USACO NOV]空牛栏

    ★★   输入文件:empty.in   输出文件:empty.out   简单对比时间限制:1 s   内存限制:64 MB [题目描述] FJ建的新牛棚里有N(2<=N<=3,000, ...

  4. Command Line Client(建库,建表)

    Enter password: ******Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection ...

  5. DOM编程艺术-setTimeout,"moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")"

    DOM编程艺术一个小demo,看到这里的时候不理解 "moveElement('"+elementID+"',"+final_x+","+f ...

  6. PHP:php遍历数组 foreach echo() list()总结

    php中可以用来遍历数组的方法有很多,如有:foreach语句.list().each(),这几个也是主要的方法,现总结如下: foreach语句遍历数组 foreach语句用于循环遍历数组,每进行一 ...

  7. Objective-C 引用计数原理

    http://www.cocoachina.com/ios/20160112/14933.html 引用计数如何存储 有些对象如果支持使用 TaggedPointer,苹果会直接将其指针值作为引用计数 ...

  8. 全面了解linux情况常用命令

    查看linux服务器CPU详细情况1. 显示CPU个数命令 # cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc ...

  9. SpringBoot操作MongoDB实现增删改查

    本篇博客主讲如何使用SpringBoot操作MongoDB. SpringBoot操作MongoDB实现增删改查 (1)pom.xml引入依赖 <dependency> <group ...

  10. 51+Nokia5110

    #include<reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned ...