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各個方法和函數

求贊 蟹蟹