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 Zweigstelle 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 zunächst die PHP-Erweiterung: SWOOLE, da keine speziellen Funktionen verwendet werden, daher verwenden wir hier pecl zur schnellen Installation:
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()
, ob sie erfolgreich ist.
Die Installation ist erfolgreich, fangen wir an, Geschäfte zu machen.
Server
Starten Sie zunächst einen Hintergrundserver und Hören Sie auf Port 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. Empfangen und Liefern von Aufgaben
public function onReceive($serv, $fd, $from_id, $data) { //使用json_decode 解析任务数据 $areas = json_decode($data,true); foreach ($areas as $area){ //投递异步任务 $serv->task($area); } }
3. Aufgabenausführung, Datenabfrage und Schreiben aus der Master-Bibliothek in die Slave-Datenbank
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. Wird aufgerufen, wenn die Aufgabe abgeschlossen ist
public function onFinish($serv, $task_id, $task_data) { echo "AsyncTask[$task_id] Finish: $task_data".PHP_EOL; }
Client-Push-Aufgabe
Dies ist im Grunde abgeschlossen. Jetzt müssen wir noch die Client-Push-Aufgabe schreiben
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; }
Dies ist im Grunde abgeschlossen. Der Rest besteht darin, ein Shell-Skript für die reguläre Ausführung zu schreiben: /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
Mit crontab geplante Aufgaben fügen wir das Skript zur geplanten Aufgabe hinzu
#设置每天12:30执行数据同步任务 30 12 * * * root /home/wwwroot/sync_db/crontab/send.sh #设置每天19:00执行数据同步任务 0 19 * * * root /home/wwwroot/sync_db/crontab/send.sh
Tipps: Fügen Sie am besten das Protokoll hinzu Schreibvorgang darin, damit Sie wissen, dass es sich um einen Task-Push handelt. Ob die Ausführung erfolgreich war.
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein.
Verwandte Empfehlungen:
php Detaillierte Erläuterung der Verwendung von UNIX-Zeitstempeln
Ajax PHP JavaScript MySQL implementiert einen einfachen, aktualisierungsfreien Online-Chatroom
Das obige ist der detaillierte Inhalt vonPHP verwendet die SWOOLE-Erweiterung, um eine geplante Synchronisierung von MySQL-Daten zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!