Maison  >  Article  >  développement back-end  >  PHP utilise l'extension SWOLE pour implémenter la synchronisation planifiée des données MySQL

PHP utilise l'extension SWOLE pour implémenter la synchronisation planifiée des données MySQL

墨辰丷
墨辰丷original
2018-05-24 10:04:001491parcourir

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

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.

Une fois l'installation réussie, commençons à écrire des affaires.

Serveur

1. serveur d'arrière-plan 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();
}

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);
 }
}

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");
}

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

public function onFinish($serv, $task_id, $task_data)
{
 echo "AsyncTask[$task_id] Finish: $task_data".PHP_EOL;
}

Tâche push client

Ceci est essentiellement terminé. tâche push client

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;
}

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

À 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

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.

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.


Recommandations associées :

php Explication détaillée de l'utilisation de l'horodatage UNIX

Ajax PHP JavaScript MySQL implémente une salle de discussion en ligne simple et sans actualisation

Résoudre le problème de la soumission du formulaire de traitement PHP de plusieurs balises d'entrée avec le même attribut de nom valeur

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!

Déclaration:
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