ホームページ >バックエンド開発 >PHPチュートリアル >PHP は SWOOLE 拡張機能を使用して MySQL データのスケジュールされた同期を実装します
この記事では、PHP SWOOLE を使用して非同期スケジュールされたタスク システムを作成する方法について詳しく説明します。
南寧会社といくつかの支店の間でコール システムが使用されています。支店の通話サーバーはイントラネット上にあるため、支店と南寧間のネットワークが不安定であるため、通話データの分析を行う必要があります。ブランチの通話データを分析します。通話データは南寧に同期されます。
最も簡単な方法は、MySQL のマスター/スレーブ同期を直接設定してデータを Nanning に同期することです。しかし、営業電話システムの会社は私たちに MySQL 権限を与えません。 したがって、この方法は放棄するしかありません。
そこで、単純に PHP を使用して単純な PHP タイミング同期ツールを実装することを考えました。その後、PHP プロセスは常にバックグラウンドで実行されるため、最初に PHP コンポーネントである SWOOLE にたどり着きました。議論の結果、ブランチ オフィスはそれを半分ごとに生成しました。データの最大量は約 5,000 なので、この解決策は実行可能ですので、そのまま実行してください。
PHP SWOOLEを使用して非同期スケジュールタスクシステムを作成します。
MySQL データベース自体のマスターとスレーブの同期は、マスター データベースのバイナリ ログを解析することによってデータをスレーブ データベースに同期することです。ただし、PHP を使用してデータを同期する場合、マスター ライブラリからバッチでデータをクエリし、それを南寧のスレーブ ライブラリに挿入することしかできません。
ここで使用するフレームワークは ThinkPHP 3.2
です。ThinkPHP 3.2
.
首先安装PHP扩展: SWOOLE,因为没有使用到特别的功能,所以这里我们使用pecl来快速安装:
pecl install swoole
安装完成后在 php.ini
里面加入 extension="swoole.so"
安装完成后,我们使用 phpinfo()
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(); }
インストールが完了したら、php.ini
に extension="swoole.so"
を追加します。インストールが完了したら、phpinfo()
を使用します。 code> を実行して、成功したかどうかを確認します。
サーバー
1. まず、バックグラウンドサーバーを起動し、ポート9501をリッスンしますpublic function onReceive($serv, $fd, $from_id, $data) { //使用json_decode 解析任务数据 $areas = json_decode($data,true); foreach ($areas as $area){ //投递异步任务 $serv->task($area); } }2。受信および配信タスク
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"); }3. タスクの実行、データがクエリされ、マスターデータベースからスレーブデータベースに書き込まれます
public function onFinish($serv, $task_id, $task_data) { echo "AsyncTask[$task_id] Finish: $task_data".PHP_EOL; }
4. タスクが完了すると呼び出されます
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; }
クライアントプッシュタスク
残りは、クライアントタスクプッシュを書くことですこれで、定期的に実行するためのシェルスクリプトを書くことができます。 /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
ヒント: ログ操作を追加することをお勧めします。これにより、タスクのプッシュと実行が成功したかどうかを知ることができます。
Php
JavaScript MySQL を使用して、シンプルなブラシレス更新を実現する オンライン チャット ルーム
PHP 処理を解決する FORM フォームが複数の名前属性を送信する input タグの問題同じ値
以上がPHP は SWOOLE 拡張機能を使用して MySQL データのスケジュールされた同期を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。