Swoole中的非同步使用

2021-08-27 08:44:00 字數 1657 閱讀 9921

改寫ws_server.php

$this->ws->set(

['worker_num' => 2,

'task_worker_num' => 2,

]);$this->ws->on("open", [$this, 'onopen']);

$this->ws->on("message", [$this, 'onmessage']);

$this->ws->on("task", [$this, 'ontask']);

$this->ws->on("finish", [$this, 'onfinish']);

$this->ws->on("close", [$this, 'onclose']);

public function onopen($ws, $request)

public function onmessage($ws, $frame) \n";

$data = [

'task' => 1,

'fd' => $frame->fd,

];$ws->task($data);

$ws->push($frame->fd, "server-push:".date("y-m-d h:i:s"));

}public function ontask($serv, $taskid, $workerid, $data)

public function onfinish($serv, $taskid, $data) \n";

echo "finish-data-sucess:\n";

}

客戶端,即ws_client.html,傳送資訊,服務端的onmessage接受並執行設定資料呼叫ontask,在ontask中列印資料3秒後返回資料給onfinish,onfinish接受資料並輸出。

使用者頁面:

瀏覽器:(客戶端)

伺服器:

第一行資料為服務端輸出,一開始建立連線的onopen(),之後先由客戶端(ws_client.html)通過js**連線並傳送資料;第二行為傳送資料前列印;傳送資料到服務端後,執行onmessage();其中再次輸出資料並建立task,呼叫ontask();在其中再次輸出資料並返回資料給onfinish();

伺服器端直接輸出是到伺服器,客戶端需要通過push,send等傳送到伺服器

客戶端通過console.log列印資料到頁面

非同步體現

public function onmessage($ws, $frame) \n";

$data = [

'task' => 1,

'fd' => $frame->fd,

];$ws->task($data);

$ws->push($frame->fd, "server-push:".date("y-m-d h:i:s"));

}

這段**中建立乙個task任務之後,不會等到任務執行完之後再push,而是會同時進行。在客戶端列印並傳送資料後,客戶端列印的資料與onmessage中的輸出間隔很短,並不會受ontask任務中sleep的影響。

使用swoole非同步傳送郵件

傳送郵件的操作一般是比較耗時的,所以我們一般採用非同步或者佇列來執行。php使用redis的publish subscribe也是一種不錯的選擇,這在以前的一篇博文中寫過。php語言本身是不支援非同步操作的,不過我們可以通過swoole擴充套件實現非同步功能,這個非同步功能基於tcp協議,相應速度還...

swoole 簡單的非同步執行

標籤 空格分隔 php 乙個io操作其實分成了兩個步驟 發起io請求和實際的io操作。阻塞io和非阻塞io的區別在於第一步,發起io請求是否會被阻塞,如果阻塞直到完成那麼就是傳統的阻塞io,如果不阻塞,那麼就是非阻塞io。同步io和非同步io的區別就在於第二個步驟是否阻塞 如果實際的io讀寫阻塞請求...

swoole非同步同步redis

在swoole開發中我們需要學習很多的知識點 就像swoole開篇部分說的 重新定義php,那麼在swoole當中最關鍵的非同步和同步問題就凸現出來 把他放在php檔案中,然後require ok 當我們要使用他的時候,記得一定要處理好命名空間的問題,用的時候 我使用的是閉包函式,當然你們有其他辦法...