這篇文章給大家分享的是有關(guān)PHP怎么使用SWOOLE擴(kuò)展實現(xiàn)定時同步MySQL數(shù)據(jù)的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站建設(shè)、成都做網(wǎng)站與策劃設(shè)計,新干網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:新干等地區(qū)。新干做網(wǎng)站價格咨詢:18982081108這里我們使用的框架是ThinkPHP 3.2
.
首先安裝PHP擴(kuò)展: SWOOLE,因為沒有使用到特別的功能,所以這里我們使用pecl來快速安裝:
pecl install swoole
安裝完成后在php.ini
里面加入extension="swoole.so"
安裝完成后,我們使用phpinfo()
來檢查是否成功了.
安裝成功了,我們就來寫業(yè)務(wù).
服務(wù)端
1、首先啟動一個后臺的服務(wù)端,監(jiān)聽端口9501
public function index() { $serv = new \swoole_server("0.0.0.0", 9501); $serv->set([ 'worker_num' => 1,//一般設(shè)置為服務(wù)器CPU數(shù)的1-4倍 'task_worker_num' => 8,//task進(jìn)程的數(shù)量 'daemonize' => 1,//以守護(hù)進(jìn)程執(zhí)行 'max_request' => 10000,//較大請求數(shù)量 "task_ipc_mode " => 2 //使用消息隊列通信,并設(shè)置為爭搶模式 ]); $serv->on('Receive', [$this, 'onReceive']);//接收任務(wù),并投遞 $serv->on('Task', [$this, 'onTask']);//可以在這個方法里面處理任務(wù) $serv->on('Finish', [$this, 'onFinish']);//任務(wù)完成時候調(diào)用 $serv->start(); }
2、接收和投遞任務(wù)
public function onReceive($serv, $fd, $from_id, $data) { //使用json_decode 解析任務(wù)數(shù)據(jù) $areas = json_decode($data,true); foreach ($areas as $area){ //投遞異步任務(wù) $serv->task($area); } }
3、任務(wù)執(zhí)行,數(shù)據(jù)從master庫查詢和寫入到slave數(shù)據(jù)庫
public function onTask($serv, $task_id, $from_id, $task_data) { $area = $task_data;//參數(shù)是地區(qū)編號 $rows = 50; //每頁多少條 //主庫地址,根據(jù)參數(shù)地區(qū)($area)編號切換master數(shù)據(jù)庫連接 //從庫MySQL實例,根據(jù)參數(shù)地區(qū)($area)編號切換slave數(shù)據(jù)庫連接 //由于程序是常駐內(nèi)存的,所以MySQL連接可以使用長連接,然后重復(fù)利用。要使用設(shè)計模式的,可以使用對象池模式 Code...... //master 庫為分公司的數(shù)據(jù)庫,slave庫為數(shù)據(jù)同步到南寧后的從庫 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; } //根據(jù)條數(shù)計算頁數(shù) $dataNumber = ceil($masterMaxIncrementId - $slaveMaxIncrementId); $eachNumber = ceil($dataNumber / $rows); $left = 0; //根據(jù)頁數(shù)來進(jìn)行分批循環(huán)進(jìn)行寫入,要記得及時清理內(nèi)存 for ($i = 0; $i < $eachNumber; $i++) { $left = $i == 0 ? $slaveMaxIncrementId : $left + $rows; $right = $left + $rows; //生成分批查詢條件 //$where = "id > $left AND <= $right"; $masterData = ...;//從主庫查詢數(shù)據(jù) $slaveLastInsertId = ...;//插入到從庫 unset($masterData,$slaveLastInsertId); } echo "New AsyncTask[id=$task_id]".PHP_EOL; $serv->finish("$area -> OK"); }
4、任務(wù)完成時候調(diào)用
public function onFinish($serv, $task_id, $task_data) { echo "AsyncTask[$task_id] Finish: $task_data".PHP_EOL; }
客戶端推送任務(wù)
到此基本完成,剩下來我們來寫客戶端任務(wù)推送
public function index() { $client = new \swoole_client(SWOOLE_SOCK_TCP); if (!$client->connect('127.0.0.1', 9501, 1)) { throw new Exception('鏈接SWOOLE服務(wù)錯誤'); } $areas = json_encode(['liuzhou','yulin','beihai','guilin']); //開始遍歷檢查 $client->send($areas); echo "任務(wù)發(fā)送成功".PHP_EOL; }
至此基本完成了,剩下的我們來寫一個shell腳本定時執(zhí)行:/home/wwwroot/sync_db/crontab/send.sh
#!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH # 定時推送異步的數(shù)據(jù)同步任務(wù) /usr/bin/php /home/wwwroot/sync_db/server.php home/index/index
使用crontab定時任務(wù),我們把腳本加入定時任務(wù)
#設(shè)置每天12:30執(zhí)行數(shù)據(jù)同步任務(wù) 30 12 * * * root /home/wwwroot/sync_db/crontab/send.sh #設(shè)置每天19:00執(zhí)行數(shù)據(jù)同步任務(wù) 0 19 * * * root /home/wwwroot/sync_db/crontab/send.sh
Tips: 好推薦在里面加入寫日志操作,這樣好知道是任務(wù)推送、執(zhí)行是否成功。
感謝各位的閱讀!關(guān)于“PHP怎么使用SWOOLE擴(kuò)展實現(xiàn)定時同步MySQL數(shù)據(jù)”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
文章標(biāo)題:PHP怎么使用SWOOLE擴(kuò)展實現(xiàn)定時同步MySQL數(shù)據(jù)-創(chuàng)新互聯(lián)
文章位置:http://chinadenli.net/article16/dhjidg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、網(wǎng)站營銷、商城網(wǎng)站、自適應(yīng)網(wǎng)站、關(guān)鍵詞優(yōu)化、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容