改寫ws_server.php
客戶端,即ws_client.html,傳送資訊,服務端的onmessage接受並執行設定資料呼叫ontask,在ontask中列印資料3秒後返回資料給onfinish,onfinish接受資料並輸出。$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";
}
使用者頁面:
瀏覽器:(客戶端)
伺服器:
第一行資料為服務端輸出,一開始建立連線的onopen(),之後先由客戶端(ws_client.html)通過js**連線並傳送資料;第二行為傳送資料前列印;傳送資料到服務端後,執行onmessage();其中再次輸出資料並建立task,呼叫ontask();在其中再次輸出資料並返回資料給onfinish();
伺服器端直接輸出是到伺服器,客戶端需要通過push,send等傳送到伺服器
客戶端通過console.log列印資料到頁面
非同步體現
這段**中建立乙個task任務之後,不會等到任務執行完之後再push,而是會同時進行。在客戶端列印並傳送資料後,客戶端列印的資料與onmessage中的輸出間隔很短,並不會受ontask任務中sleep的影響。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"));
}
使用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 當我們要使用他的時候,記得一定要處理好命名空間的問題,用的時候 我使用的是閉包函式,當然你們有其他辦法...