發佈一個輕量級的PHP實現的WEBSOKCET引擎-EZ_WS

利用零散的時間,用php這門語言寫了個輕量級的WebSocket引擎-EZ_WS,期間也在這世界上最好的語言上踩過幾個坑,不過坑踩過了,東西也出來了,現分享給大家;

GitHub網址:https://github.com/GavinLiu168/ez_ws


以下是說明文檔

EZ_WS是easy-websocket的意思,旨在提供一個websocket的php版本引擎,讓php開發人員更加快速的使用websocket。

EZ_WS使用了多進程模式以增大服務的併發能力,但windows環境下不支持php的多進程控制模塊,因此windows環境下EZ_WS就會退化成單進程模式。

以下介紹下框架的基本用法:

1.框架概念

(1)WsServer類:管理整個服務的服務類,提供了面向用戶的api;

(2)WsWorker類:主要的工作類,主要用戶socket的管理;

(3)WebSocket類:用戶描述websocket的類,是在socket上封裝出來的類,主要用於處理與websocket協議相關的邏輯;

(4)WsFrame類:用於描述websocket幀的各種參數的類,也提供面向用戶的生成查詢frame的類;

(5)IPCFrame類:用戶進程間通訊的類,主要規範了進程間通訊的協議;

(6)Task類:抽象類,用戶繼承實現該類則可使用異步任務;

(7)socket資源id($resId),框架中每個socket都用框架提供的resId來統一管理;

2.引入框架

 <?php
    require_once('../../ez_ws/ez_ws.php');
    use Lib\WsServer;
    use Lib\WsFrame;

3.WsServer類使用例子

<?php

#設置時區
date_default_timezone_set("PRC");

#新建server類
$server = new WsServer("0.0.0.0",10086);

#設置worker進程數目爲5,默認爲10
$server->setWorkerNum(5);

#註冊open函數(hanshake後觸發)
$server->on("open",function(WsServer $server,$resId){
    #ping操作
    $wf = WsFrame::pingFrame();
    $server->push($resId,$wf);
});

#註冊close函數(closed事件觸發)
$server->on("close",function(WsServer $server,$resId,$status_Code){
    //----to--do---
});

#註冊pong函數(pong事件觸發)
$server->on("pong",function(WsServer $server,$resId){
    //----to--do---
});

#註冊message函數(收到信息時觸發)
$server->on("message",function(WsServer $server,$resId,WsFrame $wf){
    #廣播消息
    $wf->mask = 0;
    $server->broadcast($wf->encode());
});

#開啓服務器
$server->start();

4.WsFrame類api

<?php
    $wf = new WsFrame();

    //設置是否結束幀以及是否開啓掩碼(注意,服務端無需開啓掩碼發送),可用鏈式操作
    $wf->finOn()->finOff()->maskOn()->maskOff();

    //設置操作碼,不設置則默認爲OPCODE_BINARY_FRAME,可鏈式操作
    /*OPCODE_CONTINUE=>"frame continuation",
    *OPCODE_TEXT_FRAME=>"text frame",
    *OPCODE_BINARY_FRAME=>"binary  frame",
    *OPCODE_CLOSE_FRAME=>"connection close",
    *OPCODE_PING=>"ping",
    *OPCODE_PONG=>"pong",
    */
    $wf->setOpcode(WsFrame::OPCODE_TEXT_FRAME);

    //設置body內容,可用鏈式操作
    $wf->setBody("hello world");

    //將wsframe編碼,發送前必須encode
    $wf->encode();

    //立即生成pingframe
    $wf = WsFrame::pingFrame();

    //立即生成pongframe
    $wf = WsFrame::pongFrame();

    //立即生成closeFrame,status爲狀態碼,缺省下爲1001正常退出碼
    $wf = WsFrame::closeFrame($status);

    //立即生成endframe,$opcode可不填,可用於大文件的分塊傳輸
    $wf = WsFrame::endFrame($opcode);

    //獲取幀的信息,以數組形式返回
    $wf->info();

    //充值數據幀
    $wf->reset();

5.異步任務(windows環境下將退化爲同步任務)

<?php
    require_once('../../ez_ws/ez_ws.php');
    use Lib\WsFrame;
    use Lib\Task;
    use Lib\WsServer;

    class MyTask extends Task{


        //必須繼承實現的方法
        protected function run(){
            echo "hello mytask";
        }

    }
發佈了67 篇原創文章 · 獲贊 31 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章