该呼叫系统在南宁公司与多家分公司之间使用,现在需要做一个呼叫数据分析。由于分公司的呼叫服务器在内网上,通过技术手段进行映射,分公司与南宁之间的网络不稳定,所以需要将分公司的呼叫数据同步到南宁。
最简单的方法就是直接配置MySQL的主从同步,然后将数据同步到南宁。但是销售电话系统上的公司不给我们MySQL权限。所以这种方法只能放弃。
所以我们简单的想了想,用PHP实现定时,一个简单的PHP定时同步工具,然后PHP进程在后台运行,所以我们首先得到了一个PHP组件:SWOOLE。经过讨论,分公司半天产生的数据量最大为5000左右,所以这个方案是可行的,我们就这样做。
我们使用PHP SWOOLE作为异步定时任务系统。
MySQL数据库的主从同步是通过解析主库中的二进制日志将数据同步到从库中。但是我们使用PHP同步数据时,只能从主库中批量查询数据,然后插入南宁的从库中。
我们这里使用的框架是ThinkPHP 3.2。
首先,安装PHP扩展:SWOOLE。因为没有使用特殊功能,这里我们使用pecl快速安装:
安装完pecl install swoole后,在php.ini中添加扩展名=' swole.so '。安装完成后,我们使用phpinfo()检查是否成功。
安装成功后,我们再写业务。
计算机网络服务器
1.首先,启动一个后台服务器并监听端口9501
public function index(){ $ server=new swoole _ server(' 0 . 0 . 0 . 0 ',9501);$serv-set([ 'worker_num'=1,//一般设置为服务器CPU数的1-4倍' task _ worker _ num'=8,//任务进程数' daemonize'=1,///执行' max_request'=10000,//作为守护进程,///。$serv-on('Receive ',[$this,' onReceive ']);//接收任务并发布$ serv-on ('task ',[$ this,' on task ']);//可以用这个方法处理任务$ serv-on ('finish ',[$ this,' onfinish ']);//任务完成后调用$ serv-start();}2.接收和交付任务
public function on receive($ server,$ FD,$ from _ id,$ data){//使用json_decode解析任务数据$areas=json_decode($data,true);foreach($ areas $ area){//交付异步任务$ server-task($ area);}}3、任务执行,从主库查询数据并写入从数据库
公共函数onTask($ server,$task_id,$from_id,$ task _ data){ $ area=$ task _ data;//参数是区域号$ rows=50//每页多少张//主库地址,根据参数区号切换主数据库连接//从数据库连接根据参数区号//MySQL连接可以使用长连接然后重用。要使用设计模式,可以使用对象池模式代码.//主库作为分支机构的数据库,从库作为从库代码后数据同步到南宁.//使用$sql获取最大的自增: SELECTMAX(ID)AS MAXID FROM SS _ CDR _ CDR _ info piloy 1 $ SLAVEMAXINCREMIMENTID=.//使用$sql从ss _ cdr _ cdr _ infolimit 1 $ mastermaxincrement=.//如果相等,则不同步。if($ slavemaximincrement=$ mastermaxincrement){ return false;}//根据文章数量计算页数$ data number=ceil($ mastermaxincrement-$ slavemaximincrement);$ EachNumber=ceil($ DataNumber/$ row);$ left=0;//根据页数分批写,记得清理内存为($ I=0;$ i $每个数字;$i ) { $left=$i==0?$ slaveMaxIncrementId : $ left $ row;$ right=$ left $ rows//生成批量查询条件//$其中=' id $ left AND=$ right$masterData=.//查询数据$ slaveLastInsertId=.//插入从库unset ($ MasterData,$ slavelasinsertid);}回显“新AsyncTask[id=$task_id]”。PHP _ EOL$ serv-finish($ area-OK’);}4.任务完成时呼叫
公共函数onFinish($ server,$task_id,$ task _ data){ echo ' AsyncTask[$ task _ id]finish : $ task _ data '。PHP _ EOL}客户端推送任务
这就基本完成了,让我们编写客户端任务推送
公共函数索引(){ $ client=new SWOOLE _ client(SWOOLE _ SOCK _ TCP);if(!$ client-connect ('127.0.0.1 ',9501,1)) {Thrownewexception('链接SWOOLE服务时出错');} $areas=json_encode(['柳州','榆林','北海','桂林']);//开始遍历检查$ client-send($ areas);回显“任务发送成功”。PHP _ EOL}到目前为止,基本完成。让我们编写一个shell脚本并定期执行它://home/wwwroot/sync _ db/crontab/send . sh。
#!/bin/bash path=/bin :/sbin 3360/usr/bin 3360/usr/sbin 3360/usr/local/bin :/usr/local/sbin 3360 ~/binexportpath #定期推送异步数据同步任务/usr/bin/PHP/home Wwwroot/sync _ db/server . phbhome/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 . shtips 3366
至此基本完成,程序需要优化~ ~ ~,欢迎大家提出更好的方法。