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 synchronisiert Daten mit der Slave-Datenbank, 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. Aufgabenausführung, Datenabfrage und Schreiben aus der Master-Bibliothek in die Slave-Datenbank
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(); }
4. Wird aufgerufen, wenn die Aufgabe abgeschlossen ist
public function onReceive($serv, $fd, $from_id, $data) { //使用json_decode 解析任务数据 $areas = json_decode($data,true); foreach ($areas as $area){ //投递异步任务 $serv->task($area); } }
Dies ist im Grunde abgeschlossen. Jetzt müssen wir noch die Client-Push-Aufgabe schreiben
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"); }
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
public function onFinish($serv, $task_id, $task_data)
{
echo "AsyncTask[$task_id] Finish: $task_data".PHP_EOL;
}
Mit crontab geplante Aufgaben fügen wir das Skript zur geplanten Aufgabe hinzu
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; }
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 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:
Imitieren Sie die PHPMyadmin-Exportfunktion, um PHP zum Exportieren der MySQL-Datenbank als .sql-Datei zu verwendenÜber thinkphp5 und ausführliche Erklärung, wie Swoole asynchrones Massenmailing über SMTP implementiert
Das obige ist der detaillierte Inhalt vonSo aktivieren Sie die SWOOLE-Erweiterung mit PHP, um MySQL-Daten regelmäßig zu synchronisieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!