ホームページ  >  記事  >  バックエンド開発  >  php + swooleを使用して非同期タスクキューを実装する方法

php + swooleを使用して非同期タスクキューを実装する方法

零到壹度
零到壹度オリジナル
2018-04-09 11:37:093473ブラウズ

この記事の内容は、php + swooleを使用して非同期タスクキューを実装する方法を共有することです。必要な友達はそれを参照してください

100通のメールを送信したい場合。 、for ループが 100 回発生したため、ユーザーはすぐに反乱を起こし、Web サイトが破壊されました。
しかし、現実的には、おそらく 10,000 件を超えるメールがあるでしょう。この遅延の問題にはどう対処すればよいでしょうか?
その答えは、非同期を使用することです。 「電子メール送信」操作をカプセル化し、バックグラウンドで非同期に 10,000 回実行します。この場合、ユーザーが Web ページを送信した後の待機時間は、「電子メール タスク リクエストをキューにプッシュする」時間だけです。また、バックグラウンド サービスはユーザーの目に見えない場所で実行されます。
「非同期キュー」の実装に関しては、MySQL テーブルや Redis を使用して送信するメールを保存し、送信対象リストを 1 分ごとに定期的に読み取って処理する人もいます。これはスケジュールされた非同期タスクキューです。ただし、現在送信されているタスクの実行には 1 分かかりますが、テキスト メッセージの送信など、リアルタイム要件が高い一部のアプリケーション シナリオではまだ高速ではありません。ユーザーは結果が返されるまで待つ必要がありません。

以下では、phpを使用してswooleを拡張し、テキストメッセージを送信するためのリアルタイム非同期タスクキューを実装する解決策について説明します。

サーバー

ステップ 1: TCP サーバーを作成します

ステップ 2: サーバーの関連する属性を設定します

ステップ 3: サーバーの関連するコールバック関数を設定して、 task

具体的なコードは次のとおりです: 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

バックエンドサービスを開始した後、クライアントはまず TCP クライアントサーバーを作成し、次に TCP バックエンドサーバーに接続してデータを送信します具体的なコードは次のとおりです: 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;;
}
?>

関連する推奨事項:

非同期タスクキューの 2 つの処理方法

PHP は swoole を使用してリアルタイム非同期を実装します。タスクキュー

Spring Boot - Redis のキースペース通知を使用してスケジュールされたタスクキューを実装します

以上がphp + swooleを使用して非同期タスクキューを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。