Workerman:PHP的socket框架
- 2021 年 4 月 26 日
- 筆記
hi,我們今天來講講Workerman,什麼是Workerman呢? 看看官網上的介紹
Workerman是一款開源高性能非同步PHP socket框架。支援高並發,超高穩定性,被廣泛的用於手機app、移動通訊,微信小程式,手游服務端、網路遊戲、PHP聊天室、硬體通訊、智慧家居、車聯網、物聯網等領域的開發。 支援TCP長連接,支援Websocket、HTTP等協議,支援自定義協議。擁有非同步Mysql、非同步Redis、非同步Http、MQTT物聯網客戶端、非同步消息隊列等眾多高性能組件
入門知識
先來點枯燥但又好玩的知識點
1. 什麼是HTTP
- HTTP是一種不保存狀態的協議
- HTTP是媒體獨立的:這意味著,只要客戶端和伺服器知道如何處理的數據內容,任何類型的數據都可以通過HTTP發送。客戶端以及伺服器指定使用適合的MIME-type內容類型
- HTTP是無連接:無連接的含義是限制每次連接只處理一個請求
下面以我自己的理解嗶嗶幾句
說白了HTTP就是:用TCP 創造一個服務
有客戶端連接就發送HTTP頭部、響應等等數據
那個客戶端就是用戶的瀏覽器
因為是協議 所以跨平台 只要讀完HTTP協議的基礎 就可以實現瀏覽器和WEB伺服器(相當麻煩
需要考慮n個東西 )
2. TCP具體流程
- 初始化
- 創建文件描述符
- 將當前的文件描述符和 IP/PORT綁定在一起;如果這個埠已經被其他進程佔用,bind失敗。
- 聲明當前這個文件描述符作為一伺服器的文件描述符,為後面的accept做準備
- 調用accept,並阻塞等待客戶端連接
- 三次握手
- 數據傳輸過程
- 建立連接後,全雙工
- 伺服器從accept返回後,立刻調用read(),讀socket就像讀管道一樣,如果沒有數據就阻塞等待
- 這時客戶端調用write()發送請求給伺服器,對客戶端得請求進行處理,在此期間客戶端調用read()阻塞等待伺服器的應答
- 伺服器調用write(),發送應答數據,再調用read()進行阻塞等待,這時客戶端read()返回,發送下一條請求。
上述上述過程是可循環執行的。
- 四次揮手
首先 我們來下載一下Workerman
我們使用composer官網下期會出這個教程

我們來寫個簡單的Web Socket聊天室吧
<?php use Workerman\Worker; require_once __DIR__ . '/vendor/autoload.php'; // 新建WebSocket協議 埠是2000 $ws_worker = new Worker("websocket://0.0.0.0:2000"); // 啟動4個進程對外提供服務 $ws_worker->count = 4; // 當收到客戶端發來的數據後返回給所有客戶端 $ws_worker->onMessage = function($connection, $data) use($ws_worker) { // 遍歷當前進程所有的客戶端連接,發送客戶端的數據 foreach($ws_worker->connections as $connection) { $connection->;send($data); } }; // 運行worker Worker::runAll();
啟動php 文件名 start

OK出現了以後 表示我們的服務啟動了
然後新建一個html文件輸入
<script> ws = new WebSocket("ws://127.0.0.1:2000"); ws.onopen = function() { alert("連接成功"); ws.send('tom'); alert("給服務端發送一個字元串:tom"); }; ws.onmessage = function(e) { alert("收到服務端的消息:" + e.data); } </script>
雙擊打開
恭喜恭喜 你成功了!
下次詳細的講解Workerman各個方法和函數
求贊 蟹蟹