在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 網頁設計教程 > 詳細頁面

php如何使用SwooleTaskWorker完成異步設置Mysql(代碼)

php如何使用SwooleTaskWorker完成異步設置Mysql(代碼)

更新時間:2025-12-03 文章作者:未知 信息來源:網絡 閱讀次數:

網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立...
網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。
本篇文章給大家帶來的內容是關于php如何使用SwooleTaskWorker實現異步操作Mysql(代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

在一般的 Server 程序中都會有一些耗時的任務,比如:發送郵件、聊天服務器發送廣播等。如果我們采用同步阻塞的防水去執行這些任務,那么這肯定會非常的慢。

Swoole 的 TaskWorker 進程池可以用來執行一些異步的任務,而且不會影響接下來的任務,很適合處理以上場景。

那么什么是異步任務呢?

可以從下面的圖示中來簡單了解一下。(來源于網絡,侵刪)

4082169211-5bc5c9e6327d8_articlex.png

我們上一個 Swoole 的文章介紹了如何創建一個簡單的服務器,并且知道了幾個核心的回調函數的使用方法。

要實現上述的異步處理,只需要增加兩個事件回調即可:onTask 和 onFinish, 這兩個回調函數分別用于執行 Task 任務和處理 Task 任務的返回結果。另外還需要在 set 方法中設置 task 進程數量。

使用示例:

class Server
{
    private $serv;
    public function __construct() {
        $this->serv = new swoole_server("0.0.0.0", 9501);
        $this->serv->set(array(
            'worker_num' => 4,
            'daemonize' => false,
            'task_worker_num' => 8
        ));
        $this->serv->on('Start', array($this, 'onStart'));
        $this->serv->on('Connect', array($this, 'onConnect'));
        $this->serv->on('Receive', array($this, 'onReceive'));
        $this->serv->on('Close', array($this, 'onClose'));
        $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";
        // 發送任務到Task進程
        $param = array(
            'fd' => $fd
        );
        $serv->task( json_encode( $param ) );
        echo "繼續處理之后的邏輯\n";
    }

    public function onTask($serv, $task_id, $from_id, $data) {
        echo "This Task {$task_id} from Worker {$from_id}\n";
        echo "Data: {$data}\n";
        for($i = 0 ; $i < 5 ; $i ++ ) {
            sleep(1);
            echo "Task {$task_id} Handle {$i} times...\n";
        }
        $fd = json_decode( $data , true )['fd'];
        $serv->send( $fd , "Data in Task {$task_id}");
        return "Task {$task_id}'s result";
    }
    public function onFinish($serv,$task_id, $data) {
        echo "Task {$task_id} finish\n";
        echo "Result: {$data}\n";
    }
    public function onStart( $serv ) {
        echo "Server Start\n";
    }
    public function onConnect( $serv, $fd, $from_id ) {
        echo "Client {$fd} connect\n";
    }
    public function onClose( $serv, $fd, $from_id ) {
        echo "Client {$fd} close connection\n";
    }
}
$server = new Server();

通過上述示例可以看到,發起一個異步任務只需要調用 swoole_server 的 task 方法就可以。發送之后會觸發 onTask 回調,可以通過 $task_id 和 $from_id 處理不同進程的不同任務。最后可以通過 return 一個字符串來將執行結果返回給 Worker 進程,Worker 進程通過 onFinish 回調來處理結果。

那么基于上述代碼就可以實現異步操作 mysql。異步操作 mysql 較適合以下場景:

  • 并發的讀寫操作

  • 沒有時序上的嚴格關系

  • 不影響主線程邏輯

好處:

  • 提高并發

  • 降低 IO 消耗

數據庫的壓力主要在于 mysql 維持的連接數,如果存在 1000 個并發,那么 mysql 就需要建立對應數量的連接。而采用長連接的方式,mysql 的連接一直維持在進程中,減少了創建連接的損耗。可以通過 swoole 開啟多個 task 進程,每一個進程內維持一個mysql 長連接,那么這樣子也可以引申出來 mysql 連接池技術。還需要注意的是,mysql 服務器如果檢測到長時間沒有沒有查詢,則會斷開連接回收資源,所以要有斷線重連的機制。

以下是一個簡單的異步操作 mysql 的示例:

還是以上的代碼,我們只需要修改 onReceive、onTask、onFinish 三個函數。

class Server
{
    private $serv;
    public function __construct() {
        $this->serv = new swoole_server("0.0.0.0", 9501);
        $this->serv->set(array(
            'worker_num' => 4,
            'daemonize' => false,
            'task_worker_num' => 8 // task進程數量 即為維持的MySQL連接的數量
        ));
        $this->serv->on('Start', array($this, 'onStart'));
        $this->serv->on('Connect', array($this, 'onConnect'));
        $this->serv->on('Receive', array($this, 'onReceive'));
        $this->serv->on('Close', array($this, 'onClose'));
        $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 "收到數據". $data . PHP_EOL;
        // 發送任務到Task進程
        $param = array(
            'sql' => $data, // 接收客戶端發送的 sql 
            'fd'  => $fd
        );
        $serv->task( json_encode( $param ) );  // 向 task 投遞任務
        echo "繼續處理之后的邏輯\n";
    }

    public function onTask($serv, $task_id, $from_id, $data) {
        echo "This Task {$task_id} from Worker {$from_id}\n";
        echo "recv SQL: {$data['sql']}\n";
        static $link = null;
        $sql = $data['sql'];
        $fd  = $data['fd'];
        HELL:
        if ($link == null) {
            $link = @mysqli_connect("127.0.0.1", "root", "root", "test");
        }
        $result = $link->query($sql);
        if (!$result) { //如果查詢失敗
            if(in_array(mysqli_errno($link), [2013, 2006])){
                //錯誤碼為2013,或者2006,則重連數據庫,重新執行sql
                    $link = null;
                    goto HELL;
            }
        }
        if(preg_match("/^select/i", $sql)){//如果是select操作,就返回關聯數組
             $data = array();
                while ($fetchResult = mysqli_fetch_assoc($result) ){
                     $data['data'][] = $fetchResult;
                }                
        }else{//否則直接返回結果
            $data['data'] = $result;
        }
        $data['status'] = "OK";
        $data['fd'] = $fd;
        $serv->finish(json_encode($data));
    }
    public function onFinish($serv, $task_id, $data) {
        echo "Task {$task_id} finish\n";
        $result = json_decode($result, true);
        if ($result['status'] == 'OK') {
            $this->serv->send($result['fd'], json_encode($result['data']) . "\n");
        } else {
            $this->serv->send($result['fd'], $result);
        }
    }
    public function onStart( $serv ) {
        echo "Server Start\n";
    }
    public function onConnect( $serv, $fd, $from_id ) {
        echo "Client {$fd} connect\n";
    }
    public function onClose( $serv, $fd, $from_id ) {
        echo "Client {$fd} close connection\n";
    }
}
$server = new Server();

以上代碼在 onReceive 時直接接收一條 sql,之后直接發送到 Task 任務中。這個時候下一步的流程緊接著輸出,這里也就體現出了異步。然后 onTask 和 onFinish 分別用來向數據庫發送 sql,處理 task 執行結果。

以上就是php如何使用SwooleTaskWorker實現異步操作Mysql(代碼)的詳細內容,更多請關注php中文網其它相關文章!


網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 粉嫩av一区二区三区天美传媒| 精品人妻少妇一区二区| 91视频 -- 69xx| 强开小嫩苞一区二区三区网站| caopor在线视频| av免费观看大全| 欧美视频在线第一页| 亚洲成年人专区| 91高清国产视频| 男人添女人下面免费视频| 久草青青在线观看| 大陆极品少妇内射aaaaa| www国产精品内射老熟女| 日本一本中文字幕| 9色porny| 国产天堂视频在线观看| 日韩精品一区在线视频| 日韩精品视频在线观看视频| 97在线免费视频观看| 国产又粗又猛又爽又黄的网站| 亚洲成人手机在线观看| 黄色a级在线观看| 99精品视频免费版的特色功能| 8x8x最新地址| 国产无遮挡猛进猛出免费软件 | 老熟妇仑乱视频一区二区 | 美女黄色片视频| 亚洲综合av在线播放| 日本高清xxxx| 免费成人午夜视频| 中文字幕22页| 免费cad大片在线观看| 又粗又黑又大的吊av| 向日葵污视频在线观看| 欧美 国产 精品| 中文字幕乱码人妻综合二区三区| xx欧美撒尿嘘撒尿xx| 超碰超碰超碰超碰超碰| 国产视频一视频二| 亚洲成人手机在线观看| 国产精品后入内射日本在线观看| 91国产精品视频在线观看| 成人午夜视频免费观看| 欧美婷婷精品激情| 国产自产在线视频| 日本高清一区二区视频| 欧美 丝袜 自拍 制服 另类| 久久人人爽av| 成年网站在线免费观看| 中国一级黄色录像| 五月婷婷六月合| 久久精品国产精品亚洲色婷婷| xxx中文字幕| 国产v亚洲v天堂无码久久久| 17c丨国产丨精品视频| 伊人影院综合在线| 亚洲少妇第一页| 国产a级一级片| 黄色一级片在线看| 成人av在线播放观看| 久久精品久久99| 尤物国产在线观看| 91极品视频在线观看| 久久精品一区二| www黄色日本| 国产真人做爰毛片视频直播 | 国产精品久久久久9999小说| 国精产品一区一区三区视频| 欧美这里只有精品| 超碰97免费观看| 视频区 图片区 小说区| 亚洲黄色av片| 一级一片免费播放| 天天在线免费视频| 国产精品一二三在线观看| 99久久99精品| 亚洲AV无码成人精品一区| 亚洲欧美日本一区二区| 欧美成人手机在线视频| 欧美亚洲视频一区| 黑人巨茎大战欧美白妇 | 日本精品免费在线观看| 99蜜桃臀久久久欧美精品网站| 男女高潮又爽又黄又无遮挡| 91国视频在线| 日韩不卡一二三| 粉嫩av一区二区三区天美传媒| 可以免费看的黄色网址| 九一免费在线观看| 欧美 国产 日本| 日韩欧美国产片| 精品嫩模一区二区三区| 男人添女人下部高潮视频在观看| 日本免费黄视频| 麻豆一区二区三区视频| 四虎4hu永久免费入口| 日韩中文字幕三区| 天天操狠狠操夜夜操| 免费网站在线观看视频| 欧美 日韩 国产 激情| 一级做a免费视频| 欧美极品少妇无套实战| 手机看片福利日韩| 欧美日韩激情四射| 久久99999| 日韩精品视频在线观看视频| 天天爱天天操天天干| www成人免费| 欧美特黄aaa| 欧美激情 国产精品| 日本精品一区在线| 日韩免费毛片视频| www插插插无码免费视频网站| 日韩一级理论片| 欧美成人精品免费| 99久久99精品| 亚洲精品视频导航| 哪个网站能看毛片| 精品人妻少妇一区二区| 波多野结衣三级在线| 少妇一级淫免费放| 免费看a级黄色片| 激情五月宗合网| 永久免费看av| 中国黄色录像片| 五月六月丁香婷婷| 中文字幕网av| 91看片在线免费观看| 久久久久久久少妇| 男人天堂网视频| 欧美日韩中文在线视频| 日韩xxxx视频| 妞干网在线视频观看| 妺妺窝人体色777777| 免费极品av一视觉盛宴| 白白操在线视频| 日本黄色片一级片| 欧美久久在线观看| 精品无码国模私拍视频| 成熟丰满熟妇高潮xxxxx视频| 福利视频一区二区三区四区| 国产精品国产对白熟妇| 尤物av无码色av无码| 丰满爆乳一区二区三区| 夫妻免费无码v看片| 国产v亚洲v天堂无码久久久| 中文字幕一区二区三区四区在线视频| 成人免费毛片播放| xxx国产在线观看| 91精品999| 男人草女人视频| 少妇av一区二区三区无码| 777久久久精品一区二区三区 | 国产成人无码精品久久久性色| 日本a级片免费观看| 亚洲免费看av| 亚洲热在线视频| 国产精品视频一二三四区| 国内精品在线观看视频| 人人干人人视频| 26uuu成人| av免费在线播放网站| 国产日韩欧美久久| 欧美一级爱爱视频| 国产理论在线播放| 女人床在线观看| 免费观看成人在线视频| 少妇熟女一区二区| 国产美女无遮挡网站| 91欧美一区二区三区| 成人午夜免费在线| 午夜精品免费看| 欧美日韩在线中文| 欧美少妇一级片| 国产精品人人妻人人爽人人牛| 欧美爱爱视频网站| 在线免费视频a| 97中文字幕在线| 日本黄色福利视频| 日韩av一二三四区| 中文字幕在线乱| 五月婷婷六月丁香激情| 男女私大尺度视频| 亚洲五月激情网| 高清一区二区视频| 精品国产一二三四区| 91精品国产吴梦梦| 天天摸天天舔天天操| 成人免费观看毛片| 97超碰人人澡| 国产情侣第一页| 精品国产一区二区三区在线| 超碰人人草人人| 无人在线观看的免费高清视频| 无码日本精品xxxxxxxxx| 超碰在线超碰在线| 奇米777在线视频| 污污的视频免费观看| 高清一区二区视频| 538在线视频观看|