Workerman 聊天系統

文檔、文件下載地址

聊天插件庫: Workerman 
文檔: http://doc2.workerman.net/
手冊: http://www.workerman.net/gatewaydoc/
下載Demo: http://doc2.workerman.net/
 CatewayWorker 服務端安裝 Liunx: http://www.workerman.net/download/GatewayWorker.zip
 CatewayWorker 服務端安裝 Window: http://www.workerman.net/download/GatewayWorker-for-win.zip

GatewayWorker框架與MVC結合總體原則:

現有mvc框架項目與GatewayWorker獨立部署互不干擾

所有的業務邏輯都由網站頁面post/get到mvc框架中完成

GatewayWorker不接受客戶端發來的數據,即GatewayWorker不處理任何業務邏輯,GatewayWorker僅僅當做一個單向的推送通道

僅當mvc框架需要向瀏覽器主動推送數據時纔在mvc框架中調用Gateway的API GatewayClient完成推送。

客戶端安裝

composer 安裝 GatewayClinet  客戶端

composer require workerman/gatewayclient
//使用時引入vendor/autoload.php 類似如下: use GatewayClient\Gateway; require_once '真實路徑/vendor/autoload.php';

 或是下載源文件到任意目錄,手動引入 GatewayClient/Gateway.php, 類似如下:

use GatewayClient\Gateway;
require_once '真實路徑/GatewayClient/Gateway.php';

服務端安裝

CatewayWorker 服務端安裝,可以直接下載源文件

composer require workerman/gateway-worker-for-win //安裝Windows版本的gateway
composer require workerman/gateway-worker //安裝Linux版本的gateway

服務端項目目錄結構,GatewayWorker單獨部署的

├── Applications // 這裏是所有開發者應用項目
│   └── YourApp  // 其中一個項目目錄,目錄名可以自定義
│       ├── Events.php // 開發者只需要關注這個文件
│       ├── start_gateway.php // gateway進程啓動腳本,包括端口號等設置
│       ├── start_businessworker.php // businessWorker進程啓動腳本
│       └── start_register.php // 註冊服務啓動腳本
│
├── start.php // 全局啓動腳本,此腳本會依次加載Applications/項目/start_*.php啓動腳本
│
└── vendor    // GatewayWorker框架和Workerman框架源碼目錄,此目錄開發者不用關心

 

服務端文件操作

創建 start.bat,一般放根目錄,Window 啓動文件,雙擊

php worker\win\start_register.php worker\win\start_gateway.php worker\win\start_businessworker.php
pause

創建 start.php,一般放根目錄,Liunx 啓動文件,命令行  php start.php start

/**
 * run with command
 * php start.php start 官網文件
 */

ini_set('display_errors', 'on');
use Workerman\Worker;

if(strpos(strtolower(PHP_OS), 'win') === 0)
{
    exit("start.php not support windows, please use start_for_win.bat\n");
}

// 檢查擴展
if(!extension_loaded('pcntl'))
{
    exit("Please install pcntl extension. See http://doc3.workerman.net/appendices/install-extension.html\n");
}

if(!extension_loaded('posix'))
{
    exit("Please install posix extension. See http://doc3.workerman.net/appendices/install-extension.html\n");
}

// 標記是全局啓動
define('GLOBAL_START', 1);

require_once __DIR__ . '/worker/vendor/autoload.php';

// 加載所有Applications/*/start.php,以便啓動所有服務, 此處我放根目錄/worker/win/ 下,其他要啓動的文件是start.bat文件中指定的文件
foreach(glob(__DIR__.'/worker/win/start*.php') as $start_file)
{
    require_once $start_file;
}
// 運行所有服務
Worker::runAll();

兩種啓動方式 :start_gateway.php start_businessworker.php start_register.php分別是進程啓動腳本,三個腳本統一由根目錄的start.php/ start.bat啓動。

文件說明

start_register.php 爲註冊服務啓動腳本,用於協調GatewayWorker集羣內部Gateway與Worker的通信,參見Register類使用一節。

注意:客戶端不要連接Register服務端口,客戶端應該連接Gateway端口

use \Workerman\Worker;
use \GatewayWorker\Register;

// 自動加載類,根據需求自定義
require_once __DIR__ . '/../../vendor/autoload.php';

// register 必須是text協議
$register = new Register('text://127.0.0.1:1234');

// 如果不是在根目錄啓動,則運行runAll方法
if(!defined('GLOBAL_START'))
{
    Worker::runAll();
}

start_gateway.php   爲gateway進程啓動腳本,主要定義了客戶端連接的端口號、協議等信息,具體參見 Gateway類的使用一節。

use \Workerman\Worker;
use \Workerman\WebServer;
use \GatewayWorker\Gateway;
use \GatewayWorker\BusinessWorker;
use \Workerman\Autoloader;

// 自動加載類
require_once __DIR__ . '/../vendor/autoload.php';
/**
 * 與GatewayWorker建立websocket連接,域名和端口改爲你實際的域名端口,
 * 其中端口爲Gateway端口,即start_gateway.php指定的端口。
 * start_gateway.php 中需要指定websocket協議,像這樣
 * $gateway = new Gateway(websocket://0.0.0.0:7272);
 * js部分:
 * ws = new WebSocket("ws://your_domain.com:7272");
 */
// gateway 進程,這裏使用Text協議,可以用telnet測試

$context = array(
    // 更多ssl選項請參考手冊 http://php.net/manual/zh/context.ssl.php
    'ssl' => array(
        // 請使用絕對路徑
        'local_cert'                 => __dir__.'/certificate/server.pem', // 也可以是crt文件
        'local_pk'                   => __dir__.'/certificate/server.key',
        'verify_peer'               => false,
        // 'allow_self_signed' => true, //如果是自簽名證書需要開啓此選項
    )
);
// websocket協議(端口任意,只要沒有被其它程序佔用就行)
$gateway = new Gateway("websocket://0.0.0.0:8899", $context);
// 開啓SSL,websocket+SSL 即wss
$gateway->transport = 'ssl';
// gateway名稱,status方便查看
$gateway->name = 'YourAppGateway';
// gateway進程數
$gateway->count = 4;
// 本機IP,分佈式部署時使用內網IP,GatewayWorker與GatewayClient不在同一臺服務器使用當前服務器內網IP,如果不在同一個內網改爲公網IP
$gateway->lanIp = '127.0.0.1';
// 內部通訊起始端口,假如$gateway->count=4,起始端口爲4000
// 則一般會使用4000 4001 4002 4003 4個端口作爲內部通訊端口 
$gateway->startPort = 2900;
// 服務註冊地址
$gateway->registerAddress = '127.0.0.1:1238';

// 心跳間隔
//$gateway->pingInterval = 10;
// 心跳數據
//$gateway->pingData = '{"type":"ping"}';

/* 
// 當客戶端連接上來時,設置連接的onWebSocketConnect,即在websocket握手時的回調
$gateway->onConnect = function($connection)
{
    $connection->onWebSocketConnect = function($connection , $http_header)
    {
        // 可以在這裏判斷連接來源是否合法,不合法就關掉連接
        // $_SERVER['HTTP_ORIGIN']標識來自哪個站點的頁面發起的websocket鏈接
        if($_SERVER['HTTP_ORIGIN'] != 'http://kedou.workerman.net')
        {
            $connection->close();
        }
        // onWebSocketConnect 裏面$_GET $_SERVER是可用的
        // var_dump($_GET, $_SERVER);
    };
}; 
*/

// 如果不是在根目錄啓動,則運行runAll方法
if(!defined('GLOBAL_START'))
{
    Worker::runAll();
}

start_businessworker.php 爲businessWorker進程啓動腳本,也即是調用Events.php的業務處理進程,具體參見 BusinessWorker類的使用一節。

use \Workerman\Worker;
use \Workerman\WebServer;
use \GatewayWorker\Gateway;
use \GatewayWorker\BusinessWorker;
use \Workerman\Autoloader;

// 自動加載類
require_once __DIR__ . '/../../vendor/autoload.php';

// bussinessWorker 進程
$worker = new BusinessWorker();
// worker名稱
$worker->name = 'YourAppBusinessWorker';
// bussinessWorker進程數量
$worker->count = 4;
// 服務註冊地址
$worker->registerAddress = '127.0.0.1:1234';

// 如果不是在根目錄啓動,則運行runAll方法
if(!defined('GLOBAL_START'))
{
    Worker::runAll();
}

Events.php 所有業務代碼都在這裏

 /* 
* 用於檢測業務代碼死循環或者長時間阻塞等問題 * 如果發現業務卡死,可以將下面declare打開(去掉//註釋),並執行php start.php reload * 然後觀察一段時間workerman.log看是否有process_timeout異常 */
//declare(ticks=1); use \GatewayWorker\Lib\Gateway; /** * 主邏輯 * 主要是處理 onConnect onMessage onClose 三個方法 * onConnect 和 onClose 如果不需要可以不用實現並刪除 */ class Events { /** * 當客戶端連接時觸發 * 如果業務不需此回調可以刪除onConnect * @param int $client_id 連接id * @desc $client_id 爲系統自動生成 */ public static function onConnect($client_id) { // 向當前client_id發送數據 /*Gateway::sendToClient($client_id, "Hello $client_id\r\n"); // 向所有人發送 Gateway::sendToAll("$client_id login\r\n");*/ } /** * 當客戶端發來消息時觸發 * @desc type:0 打開鏈接 其他發送消息 * @param int $client_id 連接id * @param mixed $message 具體消息 */ public static function onMessage($client_id, $message) { // 向所有人發送 Gateway::sendToAll("$client_id said $message\r\n"); } /** * 當用戶斷開連接時觸發 * @param int $client_id 連接id */ public static function onClose($client_id) { } }

 

啓動與停止

注意:Workerman啓動停止等命令都是在命令行中完成的。

啓動

以debug(調試)方式啓動

php start.php start

以daemon(守護進程)方式啓動

php start.php start -d

停止

php start.php stop

重啓

php start.php restart

平滑重啓

php start.php reload

查看狀態

php start.php status

debug和daemon方式區別

1、以debug方式啓動,代碼中echo、var_dump、print等打印函數會直接輸出在終端。

2、以daemon方式啓動,代碼中echo、var_dump、print等打印會默認重定向到/dev/null文件,可以通過設置Worker::$stdoutFile = '/your/path/file';來設置這個文件路徑。

3、以debug方式啓動,終端關閉後workerman會隨之關閉並退出。

4、以daemon方式啓動,終端關閉後workerman繼續後臺正常運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章