欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP擴展Swoole實現(xiàn)實時異步任務隊列示例

 更新時間:2019年04月13日 14:27:34   作者:陳達輝  
這篇文章主要介紹了PHP擴展Swoole實現(xiàn)實時異步任務隊列,結(jié)合實例形式分析了PHP擴展Swoole實現(xiàn)實時異步任務隊列相關(guān)客戶端與服務器端操作技巧,需要的朋友可以參考下

本文實例講述了PHP擴展Swoole實現(xiàn)實時異步任務隊列。分享給大家供大家參考,具體如下:

假如要發(fā)100封郵件,for循環(huán)100遍,用戶直接揭竿而起,什么破網(wǎng)站!

但實際上,我們很可能有超過1萬的郵件。怎么處理這個延遲的問題?

答案就是用異步。把“發(fā)郵件”這個操作封裝,然后后臺異步地執(zhí)行1萬遍。這樣的話,用戶提交網(wǎng)頁后,他所等待的時間只是“把發(fā)郵件任務請求推送進隊列里”的時間。而我們的后臺服務將在用戶看不見的地方跑。

在實現(xiàn)“異步隊列”這點上,有人采用MySQL表或者redis來存放待發(fā)送的郵件,然后,每分鐘定時讀取待發(fā)送列表,然后處理。這便是定時異步任務隊列。但當前提交的任務要一分鐘后才能執(zhí)行,在某些實時性要求應用場景里還是不快。有些場景要求,只有一提交任務,便馬上執(zhí)行,但用戶不需要等待返回結(jié)果。

本文將探討用php擴展swoole實現(xiàn)實時異步任務隊列的方案。

服務端

在打算放置腳本的目錄(你也可以自行新建)新建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, //一般設(shè)置為服務器CPU數(shù)的1-4倍
      'daemonize' => 1, //以守護進程執(zhí)行
      'max_request' => 10000,
      'dispatch_mode' => 2,
      'task_worker_num' => 8, //task進程的數(shù)量
      "task_ipc_mode " => 3, //使用消息隊列通信,并設(shè)置為爭搶模式
      //"log_file" => "log/taskqueueu.log" ,//日志
    ));
    $this->serv->on('Receive', array($this, 'onReceive'));
    // bind callback
    $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)
  {
    //echo "Get Message From Client {$fd}:{$data}\n";
    // send a task to task worker.
    $serv->task($data);
  }
  public function onTask($serv, $task_id, $from_id, $data)
  {
    $array = json_decode($data, true);
    if ($array['url']) {
      return $this->httpGet($array['url'], $array['param']);
    }
  }
  public function onFinish($serv, $task_id, $data)
  {
    //echo "Task {$task_id} finish\n";
    //echo "Result: {$data}\n";
  }
  protected function httpGet($url, $data)
  {
    if ($data) {
      $url .= '?' . http_build_query($data);
    }
    $curlObj = curl_init(); //初始化curl,
    curl_setopt($curlObj, CURLOPT_URL, $url); //設(shè)置網(wǎng)址
    curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1); //將curl_exec的結(jié)果返回
    curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curlObj, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($curlObj, CURLOPT_HEADER, 0); //是否輸出返回頭信息
    $response = curl_exec($curlObj); //執(zhí)行
    curl_close($curlObj); //關(guān)閉會話
    return $response;
  }
}
$server = new Server();

客戶端

啟動服務后,讓我們看看如何調(diào)用服務。新建測試文件Client_test.php

<?php
class Client
{
  private $client;
  public function __construct()
  {
    $this->client = new swoole_client(SWOOLE_SOCK_TCP);
  }
  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()) {
      if (!is_string($data)) {
        $data = json_encode($data);
      }
      return $this->client->send($data);
    } else {
      throw new Exception('Swoole Server does not connected.');
    }
  }
  public function close()
  {
    $this->client->close();
  }
}
$data = array(
  "url" => "http://192.168.10.19/send_mail",
  "param" => array(
    "username" => 'test',
    "password" => 'test'
  )
);
$client = new Client();
$client->connect();
if ($client->send($data)) {
  echo 'success';
} else {
  echo 'fail';
}
$client->close();

在上面代碼中,url即為任務所在地址,param為所需傳遞參數(shù)。

保存好代碼,在命令行或者瀏覽器中執(zhí)行Client_test.php,便實現(xiàn)了異步任務隊列。你所填寫的URL,將會在每次異步任務被提交后,以HTTP GET的方式異步執(zhí)行。

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP擴展開發(fā)教程》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《php curl用法總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《php程序設(shè)計算法總結(jié)》及《php字符串(string)用法總結(jié)

希望本文所述對大家PHP程序設(shè)計有所幫助。

相關(guān)文章

最新評論