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.
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(); }
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ée
public function onFinish($serv, $task_id, $task_data) { echo "AsyncTask[$task_id] Finish: $task_data".PHP_EOL; }
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('127.0.0.1', 9501, 1)) { throw new Exception('链接SWOOLE服务错误'); } $areas = json_encode(['liuzhou','yulin','beihai','guilin']); //开始遍历检查 $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.
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 :
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!