Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie eine asynchrone Aufgabenwarteschlange mit PHP + Swoole

So implementieren Sie eine asynchrone Aufgabenwarteschlange mit PHP + Swoole

零到壹度
零到壹度Original
2018-04-09 11:37:093468Durchsuche

Der Inhalt dieses Artikels besteht darin, Ihnen mitzuteilen, wie Sie eine asynchrone Aufgabenwarteschlange mit PHP + Swoole implementieren. Es hat einen bestimmten Referenzwert.

Angenommen, Sie möchten 100 E-Mails versenden und die for-Schleife 100 Mal ausführen. Die Benutzer werden sofort rebellieren.
Aber realistisch gesehen haben wir wahrscheinlich über 10.000 E-Mails. Wie gehe ich mit diesem Verzögerungsproblem um?
Die Antwort ist die Verwendung von asynchron. Kapseln Sie den Vorgang „E-Mail senden“ und führen Sie ihn 10.000 Mal asynchron im Hintergrund aus. In diesem Fall besteht die Wartezeit des Benutzers nach dem Absenden der Webseite nur aus der Zeit, in der er „die E-Mail-Aufgabenanforderung in die Warteschlange stellt“. Und unser Hintergrunddienst wird dort ausgeführt, wo Benutzer ihn nicht sehen können.
Im Hinblick auf die Implementierung einer „asynchronen Warteschlange“ verwenden einige Leute MySQL-Tabellen oder Redis, um zu sendende E-Mails zu speichern, und lesen dann regelmäßig jede Minute die Liste der zu sendenden E-Mails und verarbeiten sie dann. Dies ist die geplante asynchrone Aufgabenwarteschlange . Die Ausführung der aktuell übermittelten Aufgabe dauert jedoch eine Minute, was in einigen Anwendungsszenarien mit hohen Echtzeitanforderungen, z. B. beim Senden von Textnachrichten, immer noch nicht schnell ist. Sobald die Aufgabe übermittelt wird, wird sie sofort ausgeführt Der Benutzer muss nicht auf die Rückgabe des Ergebnisses warten.

Im Folgenden wird die Lösung der Verwendung von PHP zur Erweiterung von Swoole erörtert, um das Senden von Textnachrichten in der asynchronen Aufgabenwarteschlange in Echtzeit zu realisieren.

Server

Schritt 1: Erstellen Sie einen TCP-Server

Schritt 2: Legen Sie die relevanten Attribute des Servers fest

Schritt 3: Legen Sie die relevanten Callback-Funktionsverarbeitungsaufgaben des Servers fest

Der spezifische Code lautet wie folgt: 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

Nach dem Starten des Back-End-Dienstes erstellt der Client zunächst einen TCP-Client-Server und Stellt dann eine Verbindung zum TCP-Back-End-Server her und sendet Daten an den Backend-TCP-Server. Der spezifische Code lautet wie folgt: 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;;
}
?>

Verwandte Empfehlungen:

Asynchrone Aufgabenwarteschlange Zwei Verarbeitungsmethoden

PHP verwendet Swoole, um eine asynchrone Aufgabenwarteschlange in Echtzeit zu implementieren

Spring Boot – Verwenden Sie die Keyspace-Benachrichtigungen von Redis, um die Warteschlange für geplante Aufgaben zu implementieren

Das obige ist der detaillierte Inhalt vonSo implementieren Sie eine asynchrone Aufgabenwarteschlange mit PHP + Swoole. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn