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. serv-U 7以上版本pasv端口的设置及中文乱码问题

    利用serv-u架设ftp服务器已经是再常见不过了事情了,近日一朋友为图新鲜,弄了个7.4版本的新玩意儿,结果架设上去后,仅开了21端口,用LeapFtp在port模式下连接没问题,但是另一常见的cu ...

  2. FFmpeg编译i386 OSX 脚本

    话不多说, 直接上脚本 #!/bin/sh # directories PLATFORM="OSX" # FFmpeg脚本目录 SOURCE="ffmpeg-2.8.7& ...

  3. LR C语言语句复习,几个简单代码

    嵌套循环 Action() { int i,j; ;i<=;i++) { ) beark; else lr_output_message("i=%d",i); ;j<= ...

  4. 11个炫酷的 Linux 终端命令

    我已经用了十年的Linux了,通过今天这篇文章我将向大家展示一系列的命令.工具和技巧,我希望一开始就有人告诉我这些,而不是曾在我成长道路上绊住我. 1.命令行日常系快捷键 如下的快捷方式非常有用,能够 ...

  5. ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第十一天(非原创)

    文章大纲 一.课程介绍二.订单系统介绍三.项目源码与资料下载四.参考文章 一.课程介绍 一共14天课程(1)第一天:电商行业的背景.淘淘商城的介绍.搭建项目工程.Svn的使用.(2)第二天:框架的整合 ...

  6. 2 cmd中startup显示运行不了显示“不是内部或外部命令”

    解决方案: 1 在C:\Windows\System32中检查cmd.exe是否存在(如果存在的话)(检查cmd.exe是否被误删) 2 在我的电脑——属性——环境变量——在系统变量找到Path编辑前 ...

  7. base、self标签

    以新的窗口打开页面 self在自己的窗口打开

  8. VC使用编译时间作为版本号

    常用方法分两步:1. 得到编译时间:2. 设置基准时间,以编译时间距基准时间的总天数的2倍作为版本号,适当情况还可加上初值: 其中第一步实现有两种方法: 1. 直接使用系统宏:CString OcxT ...

  9. C#中Dictionary泛型集合7种常见的用法

    要使用Dictionary集合,需要导入C#泛型命名空间 System.Collections.Generic(程序集:mscorlib)  Dictionary的描述1.从一组键(Key)到一组值( ...

  10. Cocos2d-x v3.1 坐标系统(五)

    Cocos2d-x v3.1 坐标系统(五) 为了能够更好的布局以及了解对象所在的位置,我们必须对Cocos2d-x中的坐标有详细的了解,本篇文章主要就是了解Cocos中用到的坐标系统.学过数学的人都 ...