热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何用PHP使SWOOLE扩展实现定时同步MySQL数据

后端开发|php教程swoole,定时器,swoole,定时任务,php,swoole,定时器后端开发-php教程本文给大家介绍的是一次比较特殊的任务,我们使用PHPSWOOLE做

后端开发|php教程如何用PHP使SWOOLE扩展实现定时同步MySQL 数据
swoole,定时器,swoole,定时任务,php,swoole,定时器
后端开发-php教程
本文给大家介绍的是一次比较特殊的任务,我们使用PHP SWOOLE 做一个异步的定时任务系统,具体如何来实现的呢,接下来来我们好好看下吧
易语言过滤文件源码,vscode无法输出中文代码,ubuntu 虚拟网卡,tomcat虚拟目录映射,sqlite界面,adobe 网页设计师,代理商数据库,asp.net获取服务器信息,手机头像上传插件,前端框架rxjs,爬虫PC,php析构函数,上海seo优化公司排名,项目实战springboot,dede热门标签调用,传奇免费网站源码下载,网页 隐藏 显示,ecshop仿oppo模板,asp 后台开发教程,html页面禁止上下滑动,idc工单管理系统,窗体程序图标素材lzw
南宁公司和几个分公司之间都使用了呼叫系统,然后现在需要做一个呼叫通话数据分析,由于分公司的呼叫服务器是在内网,通过技术手段映射出来,分公司到南宁之间的网络不稳定,所以需要把分公司的通话数据同步到南宁。
diamond源码下载,vscode仿,ubuntu go1.8,英国tomcat,ios 打开sqlite,FTP无法找到服务器,wordpress login插件,delphi调用前端框架,c爬虫抓取网页数据,php39期,Seo网站推广计划,扁平化网站导航ui模板,网页代码 靠右,静态html网页模板,页面全屏显示插件,课程管理系统,科目一程序源码lzw
本身最简单的方法就是直接配置MySQL的主从同步就可以同步数据到南宁来了。但是销售呼叫系统那边的公司不给MySQL权限我们。 所以这个方法只能放弃了。
lol源码单机版,ubuntu脑图软件,tomcat怎么停止热部署,爬虫和json,php 附近店铺,杭州市seo搜索引擎优化lzw
于是我们干脆的想,使用PHP来实现定时一个简易的PHP定时同步工具,然后PHP进程常驻后台运行,所以首先就先到了一个PHP组件:SWOOLE,经过讨论,分公司的每天半天生成的数据量最大在5000条左右,所以这个方案是可行,就这样干。

我们使用PHP SWOOLE 做一个异步的定时任务系统。

本身MySQL数据库的主从同步是通过解析Master库中的binary-log来进行同步数据到从库的。然而我们使用PHP来同步数据的时候,那么只能从master库分批查询数据,然后插入到南宁的slave库来了。

这里我们使用的框架是 ThinkPHP 3.2 .

首先安装PHP扩展: SWOOLE,因为没有使用到特别的功能,所以这里我们使用pecl来快速安装:

pecl install swoole

安装完成后在 php.ini 里面加入 extension="swoole.so" 安装完成后,我们使用 phpinfo() 来检查是否成功了.

如何用PHP使SWOOLE扩展实现定时同步MySQL 数据

安装成功了,我们就来写业务.

服务端

1、首先启动一个后台的服务端,监听端口9501

public function index(){ $serv = new \swoole_server("0.0.0.0", 9501); $serv->set([ 'worker_num' => 1,//一般设置为服务器CPU数的1-4倍 'task_worker_num' => 8,//task进程的数量 'daemonize' => 1,//以守护进程执行 'max_request' => 10000,//最大请求数量 "task_ipc_mode " => 2 //使用消息队列通信,并设置为争抢模式 ]); $serv->on('Receive', [$this, 'onReceive']);//接收任务,并投递 $serv->on('Task', [$this, 'onTask']);//可以在这个方法里面处理任务 $serv->on('Finish', [$this, 'onFinish']);//任务完成时候调用 $serv->start();}

2、接收和投递任务

public function onReceive($serv, $fd, $from_id, $data){ //使用json_decode 解析任务数据 $areas = json_decode($data,true); foreach ($areas as $area){ //投递异步任务 $serv->task($area); }}

3、任务执行,数据从master库查询和写入到slave数据库

public function onTask($serv, $task_id, $from_id, $task_data){ $area = $task_data;//参数是地区编号 $rows = 50; //每页多少条 //主库地址,根据参数地区($area)编号切换master数据库连接 //从库MySQL实例,根据参数地区($area)编号切换slave数据库连接 //由于程序是常驻内存的,所以MySQL连接可以使用长连接,然后重复利用。要使用设计模式的,可以使用对象池模式 Code...... //master 库为分公司的数据库,slave库为数据同步到南宁后的从库 Code...... //使用$sql获取从库中最大的自增: SELECT MAX(id) AS maxid FROM ss_cdr_cdr_info limit 1 $slaveMaxIncrementId = ...; //使用$sql获取主库中最大的自增: SELECT MAX(id) AS maxid FROM ss_cdr_cdr_info limit 1 $masterMaxIncrementId = ...; //如果相等的就不同步了 if($slaveMaxIncrementId >= $masterMaxIncrementId){ return false; } //根据条数计算页数 $dataNumber = ceil($masterMaxIncrementId - $slaveMaxIncrementId); $eachNumber = ceil($dataNumber / $rows); $left = 0; //根据页数来进行分批循环进行写入,要记得及时清理内存 for ($i = 0; $i $left AND finish("$area -> OK");}

4、任务完成时候调用

public function onFinish($serv, $task_id, $task_data){ echo "AsyncTask[$task_id] Finish: $task_data".PHP_EOL;}

客户端推送任务

到此基本完成,剩下来我们来写客户端任务推送

public function index(){ $client = new \swoole_client(SWOOLE_SOCK_TCP); if (!$client->connect('127.0.0.1', 9501, 1)) { throw new Exception('链接SWOOLE服务错误'); } $areas = json_encode(['liuzhou','yulin','beihai','guilin']); //开始遍历检查 $client->send($areas); echo "任务发送成功".PHP_EOL;}

至此基本完成了,剩下的我们来写一个shell脚本定时执行:/home/wwwroot/sync_db/crontab/send.sh

#!/bin/bashPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATH# 定时推送异步的数据同步任务/usr/bin/php /home/wwwroot/sync_db/server.php home/index/index

使用crontab定时任务,我们把脚本加入定时任务

#设置每天12:30执行数据同步任务30 12 * * * root /home/wwwroot/sync_db/crontab/send.sh#设置每天19:00执行数据同步任务0 19 * * * root /home/wwwroot/sync_db/crontab/send.sh

Tips: 最好推荐在里面加入写日志操作,这样好知道是任务推送、执行是否成功。

至此基本完成,程序有待优化~~~,各位看客有更好的方法欢迎提出。


推荐阅读
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 本文介绍了在Web应用系统中,数据库性能是导致系统性能瓶颈最主要的原因之一,尤其是在大规模系统中,数据库集群已经成为必备的配置之一。文章详细介绍了主从数据库架构的好处和实验环境的搭建方法,包括主数据库的配置文件修改和设置需要同步的数据库等内容。MySQL的主从复制功能在国内外大型网站架构体系中被广泛采用,本文总结了作者在实际的Web项目中的实践经验。 ... [详细]
  • PHP函数实现分页含文本分页和数字分页【PHP】
    后端开发|php教程PHP,分页后端开发-php教程最近,在项目中要用到分页。分页功能是经常使用的一个功能,所以,对其以函数形式进行了封装。影视网源码带充值系统,vscode配置根 ... [详细]
  • mui框架offcanvas侧滑超出部分隐藏无法滚动如何解决
    web前端|js教程off-canvas,部分,超出web前端-js教程mui框架中off-canvas侧滑的一个缺点就是无法出现滚动条,因为它主要用途是设置类似于qq界面的那种格 ... [详细]
  • Linux下部署Symfoy2对app/cache和app/logs目录的权限设置,symfoy2logs
    php教程|php手册xml文件php教程-php手册Linux下部署Symfoy2对appcache和applogs目录的权限设置,symfoy2logs黑色记事本源码,vsco ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • ElasticSerach初探第一篇认识ES+环境搭建+简单MySQL数据同步+SpringBoot整合ES
    一、认识ElasticSearch是一个基于Lucene的开源搜索引擎,通过简单的RESTfulAPI来隐藏Lucene的复杂性。全文搜索,分析系统&# ... [详细]
author-avatar
王漻_957
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有