Maison >développement back-end >tutoriel php >Comment implémenter une file d'attente de tâches asynchrone en utilisant php + swoole
Le contenu de cet article est de partager avec vous comment implémenter une file d'attente de tâches asynchrone avec php + swoole. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer
<.>Supposons que vous vouliez envoyer 100 e-mails et faire une boucle 100 fois, les utilisateurs se rebelleront immédiatement. Quel site Web en panne !
Mais en réalité, nous avons probablement plus de 10 000 e-mails. Comment gérer ce problème de retard ?
La réponse est d'utiliser l'asynchrone. Encapsulez l'opération « envoyer un e-mail » et exécutez-la de manière asynchrone 10 000 fois en arrière-plan. Dans ce cas, une fois que l'utilisateur a soumis la page Web, le temps qu'il attend n'est que le temps de « pousser la demande de tâche de courrier électronique dans la file d'attente ». Et notre service en arrière-plan fonctionnera là où les utilisateurs ne pourront pas le voir.
En termes d'implémentation de "file d'attente asynchrone", certaines personnes utilisent des tables MySQL ou redis pour stocker les e-mails à envoyer, puis lisent régulièrement la liste à envoyer toutes les minutes puis la traitent. Il s'agit de la file d'attente des tâches asynchrones planifiées . Cependant, l'exécution de la tâche actuellement soumise prendra une minute, ce qui n'est toujours pas rapide dans certains scénarios d'application avec des exigences élevées en temps réel, comme l'envoi de messages texte. Dès que la tâche est soumise, elle sera exécutée immédiatement. et l'utilisateur n'a pas besoin d'attendre que le résultat soit renvoyé.
Ce qui suit discutera de la solution consistant à utiliser php pour étendre swoole afin de réaliser une file d'attente de tâches asynchrone en temps réel envoyant des messages texte.
Serveur
Étape 1 : Créer un serveur TCP
Étape 2 : Définir les attributs pertinents du serveur
Étape 3 : Définir les tâches de traitement de la fonction de rappel pertinentes du serveur
Le code spécifique est le suivant : tcp_server.php
<?php class Server{ private $serv; public function __construct(){ $this->serv = new swoole_server("0.0.0.0",9501); $this->serv->set( array( 'worker_num' => 1, //一般设置为服务器CPU数的1-4倍 'daemonize' => 1, //以守护进程执行 'max_request' => 10000, 'dispatch_mode' => 2, 'task_worker_num' => 8, //task进程的数量 "task_ipc_mode " => 3, //使用消息队列通信,并设置为争抢模式 "log_file" => "log/taskqueueu.log", ) ); $this->serv->on('Receive',array($this,'onReceive')); $this->serv->on('Task',array($this,'onTask')); $this->serv->on('Finish',array($this,'onFinish')); $this->serv->start(); } public function onReceive(swoole_server $serv, $fd, $from_id, $data){ $serv->task($data); } public function onTask($serv, $task_id, $from_id, $data){ $data = json_decode($data,true); if(!empty($data)){ return $this->sendsms($data['mobile'],$data['message']); } } public function onFinish($serv, $task_id, $data){ echo "Task {$task_id} finish\n"; } public function sendsms($mobile,$text) { $timestamp = date("Y-m-d H-i-s"); $pid = "888888888"; $send_sign = md5($pid.$timestamp."abcdefghijklmnopqrstuvwxyz"); $post_data = array(); $post_data['partner_id'] = $pid; $post_data['timestamp'] =$timestamp; $post_data['mobile'] = $mobile; $post_data['message'] = $text; $post_data['sign'] = $send_sign; $url='http://182.92.149.100/sendsms'; $o=""; foreach ($post_data as $k=>$v) { $o.= "$k=".urlencode($v)."&"; } $post_data=substr($o,0,-1); $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL,$url); //为了支持cookie //curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); if(strpos($result,"success")!==false) { $outstr=1; } else { $outstr=502; } return $outstr; } } $server = new Server(); ?>
Client
Après avoir démarré le service back-end, le client crée d'abord un serveur client TCP, et se connecte ensuite au serveur back-end TCP et envoie les données au serveur TCP backend. Le code spécifique est le suivant : client.php<?php class Client{ public $client; public function __construct(){ $this->client= new swoole_client(SWOOLE_SOCK_TCP);//默认同步tcp客户端,添加参数SWOOLE_SOCK_ASYNC为异步 } public function connect(){ if(!$this->client->connect('127.0.0.1',9501,1)){ throw new Exception(sprintf('Swoole Error: %s', $this->client->errCode)); } } public function send($data){ if($this->client->isConnected()){ $data = json_encode($data); //print $data; if($this->client->send($data)){ return 1; }else{ throw new Exception(sprintf('Swoole Error: %s', $this->client->errCode)); } }else{ throw new Exception('Swoole Server does not connected.'); } } public function close(){ $this->client->close(); } } $client= new Client(); $client->connect(); $data=array( 'mobile'=>'18511487955', 'message'=>'you mobile 18511487955' ); if($client->send($data)){ echo 'succ'; }else{ echo 'fail'; } ?>
Recommandations associées :
File d'attente des tâches asynchrones Deux méthodes de traitement
PHP utilise swoole pour implémenter une file d'attente des tâches asynchrones en temps réel
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!