Comment utiliser PHP pour permettre à l'extension SWOLE de synchroniser régulièrement les données MySQL

不言
Libérer: 2023-03-31 13:38:01
original
1589 Les gens l'ont consulté

Cet article vous présente une tâche relativement particulière. Nous utilisons PHP SWOLE pour créer un système de tâches planifiées asynchrones. Comment l'implémenter spécifiquement ?

Nanning Company Nous utilisons un système d'appel avec. plusieurs succursales, et maintenant nous devons faire une analyse des données d'appel. Étant donné que le serveur d'appels de la succursale est sur l'intranet et cartographié par des moyens techniques, le réseau entre la succursale et Nanning est instable, les données d'appel de la succursale doivent donc être analysées. être synchronisé avec Nanning.

La méthode la plus simple consiste à configurer directement la synchronisation maître-esclave de MySQL pour synchroniser les données avec Nanning. Mais la société du système d'appel commercial ne nous donne pas les autorisations MySQL. Cette méthode ne peut donc qu’être abandonnée.

Nous avons donc simplement pensé à utiliser PHP pour implémenter un simple outil de synchronisation de timing PHP, puis le processus PHP s'exécute toujours en arrière-plan, nous sommes donc d'abord arrivés à un composant PHP : SWOOLE. Après discussion, la filiale. La quantité maximale de données générées en une demi-journée est d'environ 5 000, cette solution est donc réalisable, alors faites-la.

Nous utilisons PHP SWOLE pour créer un système de tâches planifiées asynchrones.

La synchronisation maître-esclave de la base de données MySQL elle-même synchronise les données avec la base de données esclave en analysant le journal binaire dans la base de données maître. Cependant, lorsque nous utilisons PHP pour synchroniser les données, nous ne pouvons interroger les données que par lots à partir de la bibliothèque principale, puis les insérer dans la bibliothèque esclave de Nanning.

Le framework que nous utilisons ici est ThinkPHP 3.2 .

Installez d'abord l'extension PHP : SWOOLE, car aucune fonction spéciale n'est utilisée, nous utilisons donc ici pecl pour une installation rapide :

pecl install swoole
Copier après la connexion

Une fois l'installation terminée, ajoutez php.ini à extension="swoole.so" Une fois l'installation terminée, nous utilisons phpinfo() pour vérifier si elle a réussi.

L'installation est réussie, commençons à écrire des affaires.

Serveur

1. serveur et écoute du 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();
}
Copier après la connexion

2. Réception et livraison des tâches

public function onReceive($serv, $fd, $from_id, $data)
{
 //使用json_decode 解析任务数据
 $areas = json_decode($data,true);
 foreach ($areas as $area){
  //投递异步任务
  $serv->task($area);
 }
}
Copier après la connexion

3. Exécution de la tâche, les données sont interrogées et écrites de la base de données maître vers la base de données esclave

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");
}
Copier après la connexion

4. Appelée lorsque la tâche est terminée

public function onFinish($serv, $task_id, $task_data)
{
 echo "AsyncTask[$task_id] Finish: $task_data".PHP_EOL;
}
Copier après la connexion

Tâche de poussée du client

Ceci est pratiquement terminé. Il nous reste à écrire au client. tâche push

public function index()
{
 $client = new \swoole_client(SWOOLE_SOCK_TCP);
 if (!$client->connect(&#39;127.0.0.1&#39;, 9501, 1)) {
  throw new Exception(&#39;链接SWOOLE服务错误&#39;);
 }
 $areas = json_encode([&#39;liuzhou&#39;,&#39;yulin&#39;,&#39;beihai&#39;,&#39;guilin&#39;]);
 //开始遍历检查
 $client->send($areas);
 echo "任务发送成功".PHP_EOL;
}
Copier après la connexion

Ceci est pratiquement terminé. Le reste consiste à écrire un script shell pour une exécution régulière : /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
Copier après la connexion

À l'aide des tâches planifiées crontab, nous ajoutons le script aux tâches planifiées

#设置每天12:30执行数据同步任务
30 12 * * * root /home/wwwroot/sync_db/crontab/send.sh
#设置每天19:00执行数据同步任务
0 19 * * * root /home/wwwroot/sync_db/crontab/send.sh
Copier après la connexion

Conseils : La plupart Il est recommandé d'y ajouter une opération d'écriture de journal, afin que vous puissiez savoir si la poussée et l'exécution de la tâche ont réussi.

Ceci est fondamentalement terminé. Le programme doit être optimisé~~~ Si vous avez de meilleures méthodes, n'hésitez pas à les suggérer.

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Imitez la fonction d'exportation de PHPMyadmin pour utiliser PHP pour exporter la base de données MySQL sous forme de fichier .sql

À propos de thinkphp5 et explication détaillée de la façon dont swoole implémente le mailing de masse asynchrone via SMTP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!