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同样能实现,但效率要慢得多。

    

最新文章

  1. java中final的理解
  2. 常见面试问题 - Useful Links
  3. hdu 4651 - Partition(五边形数定理)
  4. Greedy --- HNU 13320 Please, go first
  5. July 24th, Week 31st Sunday, 2016
  6. ls常用参数
  7. Jquery判断div是否显示
  8. fork和exec函数
  9. SpringMVC 视图解析器
  10. centos 命令
  11. CMD命令操作MySql数据库详解
  12. ●BZOJ 4596 [Shoi2016]黑暗前的幻想乡
  13. win10 .net3.5的问题及解决方案
  14. OJ:奇怪的类复制
  15. Testlink1.9.17使用方法(第九章 测试结果分析)
  16. 原生CSS设置网站主题色—CSS变量赋值
  17. HDMI EDID 处理过程
  18. Django电商项目---完成购物车页面day4
  19. ajax异步请求302
  20. 用aws cli 下载s3中数据到本地

热门文章

  1. Storm概念学习系列之Tuple元组(数据载体)
  2. 为什么我们使用Nginx而不是Apache?
  3. hdu 5489——Removed Interval——————【删除一段区间后的LIS】
  4. ElasticSearch 处理自然语言流程
  5. 如何下载最新的固件到Pixhawk
  6. Day4 HTML新增元素与CSS布局
  7. Java开发工具IntelliJ IDEA本地历史记录的使用方法
  8. tas5717/5719功放问题点总结
  9. HDU1043 八数码(BFS + 打表)
  10. hihocoder第三十六周 二分查找