91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP怎么使用SWOOLE擴展實現定時同步MySQL數據

發布時間:2021-07-07 10:58:36 來源:億速云 閱讀:193 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關PHP怎么使用SWOOLE擴展實現定時同步MySQL數據的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

這里我們使用的框架是 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 < $eachNumber; $i++) {
  $left = $i == 0 ? $slaveMaxIncrementId : $left + $rows;
  $right = $left + $rows;
  //生成分批查詢條件
  //$where = "id > $left AND <= $right";
  $masterData = ...;//從主庫查詢數據
  $slaveLastInsertId = ...;//插入到從庫
  unset($masterData,$slaveLastInsertId);
 }

 echo "New AsyncTask[id=$task_id]".PHP_EOL;
 $serv->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/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export 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: 最好推薦在里面加入寫日志操作,這樣好知道是任務推送、執行是否成功。

感謝各位的閱讀!關于“PHP怎么使用SWOOLE擴展實現定時同步MySQL數據”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宣威市| 开封县| 凌云县| 吉林省| 巴南区| 屏东县| 昌宁县| 比如县| 九龙县| 屯昌县| 吉隆县| 津市市| 阳城县| 会理县| 保德县| 武宣县| 云龙县| 宁城县| 晴隆县| 沙湾县| 永济市| 乌拉特后旗| 当雄县| 阿拉善右旗| 荆门市| 潼关县| 固原市| 台南市| 横山县| 壤塘县| 崇阳县| 安丘市| 称多县| 兴山县| 察哈| 措美县| 临沂市| 海兴县| 小金县| 樟树市| 青海省|