Maison >développement back-end >tutoriel php >Comment implémenter une file d'attente de tâches asynchrone en utilisant php + swoole

Comment implémenter une file d'attente de tâches asynchrone en utilisant php + swoole

零到壹度
零到壹度original
2018-04-09 11:37:093504parcourir

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(  
            &#39;worker_num&#39; => 1,                //一般设置为服务器CPU数的1-4倍  
            &#39;daemonize&#39; => 1,                 //以守护进程执行  
            &#39;max_request&#39; => 10000,  
            &#39;dispatch_mode&#39; => 2,  
            &#39;task_worker_num&#39; => 8,           //task进程的数量  
            "task_ipc_mode " => 3,            //使用消息队列通信,并设置为争抢模式  
            "log_file" => "log/taskqueueu.log",
        )
    );
    $this->serv->on(&#39;Receive&#39;,array($this,&#39;onReceive&#39;));
    $this->serv->on(&#39;Task&#39;,array($this,&#39;onTask&#39;));
    $this->serv->on(&#39;Finish&#39;,array($this,&#39;onFinish&#39;));   
    $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[&#39;mobile&#39;],$data[&#39;message&#39;]);   
    }
  }
  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[&#39;partner_id&#39;] = $pid;  
		$post_data[&#39;timestamp&#39;] =$timestamp;  
		$post_data[&#39;mobile&#39;] = $mobile;  
		$post_data[&#39;message&#39;] = $text;  
		$post_data[&#39;sign&#39;] = $send_sign;  
		$url=&#39;http://182.92.149.100/sendsms&#39;;  
		$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, &#39;cookie.txt&#39;);  
		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(&#39;127.0.0.1&#39;,9501,1)){
      throw new Exception(sprintf(&#39;Swoole Error: %s&#39;, $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(&#39;Swoole Error: %s&#39;, $this->client->errCode));
      }
    }else{
      throw new Exception(&#39;Swoole Server does not connected.&#39;);  
    }

  }
  public function close(){
    $this->client->close();
  }
}
$client= new Client();
$client->connect();
$data=array(
  &#39;mobile&#39;=>&#39;18511487955&#39;,
  &#39;message&#39;=>&#39;you mobile 18511487955&#39;
);
if($client->send($data)){
  echo &#39;succ&#39;;
}else{
  echo &#39;fail&#39;;
}
?>

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

Spring Boot - Utilisez les notifications Keyspace de Redis pour implémenter la file d'attente des tâches planifié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!

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