ホームページ >バックエンド開発 >PHPチュートリアル >php + swooleを使用して非同期タスクキューを実装する方法
この記事の内容は、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( '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
バックエンドサービスを開始した後、クライアントはまず 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('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'; } ?>
関連する推奨事項:
PHP は swoole を使用してリアルタイム非同期を実装します。タスクキュー
Spring Boot - Redis のキースペース通知を使用してスケジュールされたタスクキューを実装します
以上がphp + swooleを使用して非同期タスクキューを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。