Dieser Artikel stellt Ihnen eine relativ spezielle Aufgabe vor. Wir verwenden PHP SWOOLE, um ein asynchrones geplantes Aufgabensystem zu erstellen.
Nanning Company Wir verwenden ein Aufrufsystem Mehrere Filialen, und jetzt müssen wir eine Anrufdatenanalyse durchführen. Da sich der Anrufserver der Filiale im Intranet befindet und durch technische Mittel zugeordnet ist, ist das Netzwerk zwischen der Filiale und Nanning instabil, sodass die Anrufdaten der Filiale überprüft werden müssen mit Nanning synchronisiert werden.
Die einfachste Methode besteht darin, die Master-Slave-Synchronisation von MySQL direkt zu konfigurieren, um Daten mit Nanning zu synchronisieren. Aber das Unternehmen im Verkaufsgesprächssystem erteilt uns keine MySQL-Berechtigungen. Daher kann diese Methode nur aufgegeben werden.
Also haben wir einfach darüber nachgedacht, PHP zu verwenden, um ein einfaches PHP-Timing-Synchronisationstool zu implementieren, und dann läuft der PHP-Prozess immer im Hintergrund, also kamen wir zuerst zu einer PHP-Komponente: SWOOLE. Nach Diskussion, der Zweigfirma Die maximale Datenmenge, die in einem halben Tag generiert wird, beträgt etwa 5.000, daher ist diese Lösung machbar, also machen Sie es einfach.
Wir verwenden PHP SWOOLE, um ein asynchrones geplantes Aufgabensystem zu erstellen.
Die Master-Slave-Synchronisierung der MySQL-Datenbank selbst besteht darin, Daten mit der Slave-Datenbank zu synchronisieren, indem das Binärprotokoll in der Master-Datenbank analysiert wird. Wenn wir jedoch PHP zum Synchronisieren von Daten verwenden, können wir die Daten nur stapelweise aus der Master-Bibliothek abfragen und sie dann in die Slave-Bibliothek in Nanning einfügen.
Das Framework, das wir hier verwenden, ist ThinkPHP 3.2
.
Installieren Sie zuerst die PHP-Erweiterung: SWOOLE, da keine speziellen Funktionen verwendet werden, daher verwenden wir hier pecl, um schnell zu installieren:
pecl install swoole
Nachdem die Installation abgeschlossen ist, fügen Sie php.ini
in extension="swoole.so"
hinzu. Nachdem die Installation abgeschlossen ist, überprüfen wir mit phpinfo()
Server
1 Starten Sie zunächst einen Hintergrundserver und überwachen Sie Port 9501public 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(); }
public function onReceive($serv, $fd, $from_id, $data) { //使用json_decode 解析任务数据 $areas = json_decode($data,true); foreach ($areas as $area){ //投递异步任务 $serv->task($area); } }
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"); }
ist im Grunde abgeschlossen. Der Rest besteht darin, den Client-Task-Push zu schreiben
public function onFinish($serv, $task_id, $task_data) { echo "AsyncTask[$task_id] Finish: $task_data".PHP_EOL; }
Ausführung: /home /wwwroot/sync_db/crontab/send.sh
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; }
Mithilfe der geplanten Crontab-Aufgabe fügen wir das Skript zur geplanten Aufgabe hinzu
#!/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
Tipps: Fügen Sie am besten die hinzu Der Protokollschreibvorgang ist darin enthalten, sodass Sie leicht erkennen können, ob der Push und die Ausführung der Aufgabe erfolgreich sind.
Das Programm muss optimiert werden~~~ Wenn Sie bessere Methoden haben, können Sie diese gerne vorschlagen.
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.
Verwandte Empfehlungen:
PHP implementiert die Methode zum Abfragen verschiedener Elemente in zwei ArraysPHP implementiert den Effekt des MySQL-VerbindungspoolsDas obige ist der detaillierte Inhalt vonPHP verwendet die SWOOLE-Erweiterung, um die Timing-Synchronisierung zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!