文檔、文件下載地址
聊天插件庫: 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繼續後臺正常運行。