# ThinkPHP 5.1 Workerman 快速上手指南
本篇內(nèi)容主要講述了最新的`think-worker`擴展的使用。
[TOC=2,3]
>[info] 本指南的目的不是為了讓你掌握`Workerman`開發(fā),而且?guī)椭闶褂胉think-worker`快速部署`ThinkPHP5.1`應(yīng)用到`Workerman`的`HttpServer`,以及使用快速啟動`Workerman`服務(wù)(包括`GatewayWorker`),如果你需要了解`Workerman`的具體用法和原理,請參考[Workerman官方文檔](http://doc3.workerman.net/),說的比較詳細了。
>
>[danger]#### 本文的內(nèi)容并不適用于ThinkPHP `5.0`及以下版本 !如果你發(fā)現(xiàn)文中的例子沒法正確執(zhí)行,請檢查你的think-worker擴展是否已經(jīng)更新到最新版本。
## 安裝`Workerman`和`think-worker`
> Workerman是一款純PHP開發(fā)的開源高性能的PHP socket 服務(wù)器框架。而 `think-worker`則是ThinkPHP官方發(fā)布的一個`workerman`擴展,從`2.0+`版本完善了對`Workerman`的支持。
>
`Workerman`是一個純PHP的實現(xiàn),因此基本上不需要特殊的安裝,你只需要通過`composer`直接安裝即可。
~~~
composer require workerman/workerman
~~~
> 注意,最新版本的workerman已經(jīng)統(tǒng)一了Linux和Windows版本,因此不需要單獨安裝windows版本了。
事實上在安裝`think-worker`擴展的時候會自動安裝`workerman`依賴包,所以直接在你的項目根目錄下運行下面的命令安裝擴展,如果你還沒有安裝`workerman`的話也會自動安裝。
~~~
composer require topthink/think-worker
~~~
本文中的內(nèi)容以最新版本的擴展為例(最好確保安裝的是`V2.0.8+`版本,可能部分功能老版本的擴展不支持),如果你的擴展版本較舊,請更新框架或者擴展版本。
`ThinkPHP5+`的擴展都是基于`Composer`安裝的,所以確認你已經(jīng)安裝了`Composer`。
如果你已經(jīng)有自己的ThinkPHP`5.1`項目了,為了支持最新的特性,**建議更新到最新版本**(`V5.1.20+`),然后可以在應(yīng)用根目錄下使用下面命令安裝擴展。
~~~
composer require topthink/think-worker
~~~
會安裝最新的穩(wěn)定版本的`think-worker`擴展。
如果你是第一次使用ThinkPHP`5.1`,那么可以先創(chuàng)建一個初始項目,然后再安裝擴展,依次執(zhí)行下面的命令即可。
~~~
composer create-project topthink/think tp
cd tp
composer require topthink/think-worker
~~~
## 啟動`Workerman HTTP`服務(wù)
第一個場景(也是該擴展最重要的一個場景),畢竟大部分使用`think-worker`擴展的用戶都是在使用ThinkPHP開發(fā)網(wǎng)站或者項目,使用`think-worker`擴展可以讓你的產(chǎn)品直接部署到`Workerman`上,并且享受下面的優(yōu)勢:
* 無需對代碼進行改造就能帶來性能的數(shù)倍提升;
* 可以在`Apache`/`Nginx`等傳統(tǒng)WEB服務(wù)器和`Workerman`之間切換部署;
> 簡單點說,就是你可以在傳統(tǒng)模式下開發(fā)你的應(yīng)用,然后直接部署到`Workerman`上運行,但無需針對`Workerman`寫任何的處理代碼。
安裝完擴展后,你什么都不需要做,最簡單的就是直接在命令行(應(yīng)用根目錄下面)下執(zhí)行:
~~~cmd
php think worker
~~~
啟動成功后會顯示類似下面的信息
~~~
Starting Workerman http server...
Workerman[think] start in DEBUG mode
----------------------- WORKERMAN -----------------------------
Workerman version:3.5.13 PHP version:7.2.7-0ubuntu0.18.04.2
------------------------ WORKERS -------------------------------
user worker listen processes status
kancloud thinkphp http://0.0.0.0:2346 4 [OK]
----------------------------------------------------------------
Press Ctrl+C to stop. Start success.
~~~
可以看到已經(jīng)在`0.0.0.0:2346`啟動一個HTTP Server服務(wù)端(默認啟動的是調(diào)試模式),下面我們可以直接訪問當前的應(yīng)用。
~~~
http://localhost:2346
~~~
如果你之前已經(jīng)有運行一個80端口的WEB服務(wù),可以同時訪問,你也可以比較下兩個頁面的區(qū)別。
如果你是剛創(chuàng)建的項目,那么可以直接看到ThinkPHP`5.1`的歡迎頁面。

否則你會看到你的項目首頁。
### 守護進程模式
如果需要使用守護進程模式運行(只支持`Linux`環(huán)境),可以使用
~~~cmd
php think worker -d
~~~
會看到類似下面的信息:
~~~
Starting Workerman http server...
----------------------- WORKERMAN -----------------------------
Workerman version:3.5.13 PHP version:7.2.7-0ubuntu0.18.04.2
------------------------ WORKERS -------------------------------
user worker listen processes status
kancloud thinkphp http://0.0.0.0:2346 4 [OK]
----------------------------------------------------------------
Input "php think stop" to stop. Start success.
~~~
> 注意,最后一句`php think stop`提示信息并不正確,這是由于`Workerman`沒有準確定位到入口文件導致。`stop`命令的正確用法,我們會在后面講到。
>
### 基本操作(只支持`Linux`環(huán)境)
>[danger] 這一節(jié)的內(nèi)容只支持`Linux`環(huán)境
可以在命令行使用
~~~
php think worker [操作]
~~~
> 如果沒有輸入任何操作,則默認為`start`操作。
支持的操作包括:
操作|描述
---|---
start|啟動服務(wù)(默認操作)
reload|平滑重啟
stop|停止服務(wù)
restart|重啟服務(wù)
status|查看服務(wù)運行信息
connections|查看連接信息
如果要停止服務(wù),可以使用
~~~cmd
php think worker stop
~~~
`reload`服務(wù)
~~~cmd
php think worker reload
~~~
`stop`服務(wù)
~~~cmd
php think worker stop
~~~
`restart`服務(wù)
~~~cmd
php think worker restart
~~~
> `restart`和`reload`的區(qū)別是,`restart`會先`stop`然后`start`,而`reload`則是平滑重啟服務(wù),不會中斷服務(wù)。
### 配置文件
`HTTPServer`的參數(shù)可以在應(yīng)用配置目錄下的`worker.php`里面配置,該文件會在擴展安裝的時候自動生成(如果沒有則可以自己創(chuàng)建)。
擴展自帶的配置參數(shù)主要包括:
配置參數(shù) | 描述|默認值
--- | --- | ---
host | 監(jiān)聽地址|0.0.0.0
port | 監(jiān)聽端口|2346
root| WEB根目錄| public目錄
app_path | 應(yīng)用目錄(守護進程模式必須設(shè)置)|自動識別
file_monitor | 是否監(jiān)控文件更改(V2.0.9+)| false
file_monitor_interval| 監(jiān)控文件間隔(秒)(V2.0.9+)| 2
file_monitor_path | 監(jiān)控目錄 (V2.0.9+)| 默認監(jiān)控application和config目錄
> 其它的`workerman`參數(shù)可以參考官方文檔的[Worker類屬性](http://doc3.workerman.net/315129),所有`Workerman`本身支持的配置參數(shù)都可以直接在`worker.php`中使用。
>
### 修改地址和端口
如果你需要修改地址和端口,可以修改`worker.php`配置文件
~~~
'host' => 'tp5.com', // 監(jiān)聽地址
'port' => 8080, // 監(jiān)聽端口
~~~
改完后,需要重啟服務(wù)才能生效
~~~cmd
php think worker restart
~~~
> 如果是在windows下面的話,可以使用`CTRL+C`停止服務(wù),然后再啟動服務(wù)。
現(xiàn)在可以直接訪問
~~~
http://tp5.com:8080
~~~
>[danger] 如果你需要設(shè)置`80`端口,需要`root`權(quán)限才可以。
> 如果你安裝的是`2.0.8+`版本的擴展,還可以支持在命令行指定地址和端口,例如:
~~~cmd
php think worker -H tp.com -p 2800
~~~
會顯示如下信息:
~~~
Starting Workerman http server...
Workerman[think] start in DEBUG mode
----------------------- WORKERMAN -----------------------------
Workerman version:3.5.13 PHP version:7.2.7-0ubuntu0.18.04.2
------------------------ WORKERS -------------------------------
user worker listen processes status
kancloud thinkphp http://tp.com:2800 4 [OK]
----------------------------------------------------------------
Press Ctrl+C to stop. Start success.
~~~
> 如果配置文件和命令行都指定了`host`和`port`選項,則命令行參數(shù)優(yōu)先。
>
如果啟動了多個不同端口的服務(wù),`reload`、`restart`和`stop`等操作必須也是針對某個端口的才能正確操作,我們以`reload`操作為例進行說明。
如果我們需要`reload`前面啟動的`tp.com:2800`服務(wù),下面的指令是錯誤的
~~~cmd
php think worker reload
~~~
可能會出現(xiàn)錯誤提示:
~~~
Workerman[think] reload
Workerman[think] not run
~~~
必須帶上正確的端口號(`host`不是必須的)
~~~cmd
php think worker reload -p 2800
~~~
然后,你會看到提示信息如下,表示`reload`成功:
~~~
Workerman[think] reload
~~~
### 文件監(jiān)控
由于`Workerman`服務(wù)運行過程中PHP文件是常駐內(nèi)存運行的,這樣可以避免重復(fù)讀取磁盤、重復(fù)解釋編譯PHP,以便達到最高性能。所以更改業(yè)務(wù)代碼后必須手動`reload`或者`restart`才能生效。
`think-worker`擴展提供了監(jiān)控文件更新的功能,在檢測到相關(guān)目錄的文件有更新后會自動`reload`,從而不需要手動進行`reload`操作,方便開發(fā)調(diào)試。
如果你的應(yīng)用開啟了調(diào)試模式,文件監(jiān)控功能是自動開啟的,為了便于調(diào)試,我們強烈建議在開發(fā)階段開啟調(diào)試模式。
>[danger] 原則上,在部署模式下不建議開啟文件監(jiān)控,一方面有性能損耗,另外一方面對文件所做的任何修改都需要確認無誤才能進行更新部署。另外由于`windows`下不支持`reload`操作,因此文件監(jiān)控功能只支持`Linux`環(huán)境。
如果你確實需要在部署模式下開啟文件監(jiān)控,可以設(shè)置如下:
~~~
'file_monitor' => true, // 開啟文件監(jiān)控
'file_monitor_interval' => 1, // 文件監(jiān)控檢測的時間間隔
'file_monitor_path' => '', // 文件監(jiān)控目錄 一般不需要設(shè)置 默認會監(jiān)控應(yīng)用目錄和配置目錄
~~~
在調(diào)試模式下,或者開啟了文件監(jiān)控后,我們進行一下測試。
修改你的`Index`控制器文件,在index方法中添加一段調(diào)試輸出代碼
~~~
dump('hello');
~~~
然后刷新你的瀏覽器訪問,看是否已經(jīng)實時生效了。
文件監(jiān)控的目錄默認會自動監(jiān)控應(yīng)用目錄`application`和配置文件目錄`config`下面的`php`文件,如果你還需要增加其它的監(jiān)控目錄,例如增加路由配置目錄,可以設(shè)置為:
~~~
'file_monitor_path' => [
'/home/www/tp.com/application',
'/home/www/tp.com/config',
'/home/www/tp.com/route',
]
~~~
或者設(shè)置整個項目目錄進行文件監(jiān)控
~~~
'file_monitor_path' => [
'/home/www/tp.com'
]
~~~
### 事件回調(diào)
擴展自帶的`HTTPServer`包含了`onWorkerStart`和`onMessage`兩個事件回調(diào),你如果需要增加其它的回調(diào)事件處理,可以在配置文件中直接添加:
~~~
'onConnect' => function($connection)
{
echo "new connection from ip " . $connection->getRemoteIp() . "\n";
},
'onClose' => function($connection)
{
echo "connection closed\n";
},
~~~
關(guān)于事件回調(diào)的具體用法,可以參考`workerman`官方文檔的[回調(diào)屬性](http://doc3.workerman.net/315144)。
>[danger] 如果不熟悉內(nèi)部機制,請勿隨意替換和更改`onWorkerStart`和`onMessage`事件回調(diào),會導致不可預(yù)期的結(jié)果。
### 靜態(tài)資源訪問
為了確保靜態(tài)資源的正常訪問,請確認下面的參數(shù)配置正確:
~~~
// 網(wǎng)站根目錄位置
'root' => Env::get('root_path') . 'public',
~~~
> 使用Chrome瀏覽器會自動請求一次`favicon.ico`,所以確保你的網(wǎng)站根目錄下面有存在`favicon.ico`文件,否則會產(chǎn)生一次`404`請求的錯誤日志。
### `HTTPS`支持
`Workerman`開啟`SSL`的前提如下:
* Workerman版本不小于`3.3.7`
* PHP安裝了`openssl`擴展
* 已經(jīng)申請了證書(`pem/crt`文件及`key`文件,假設(shè)放在了`/etc/nginx/conf.d/ssl`下)
然后在`worker.php`配置文件中設(shè)置
~~~
'host' => '0.0.0.0',
'port' => 443,
// 開啟SSL訪問支持
'ssl' => true,
// 或者改為下面的配置
// 'transport' => 'ssl',
'context' => [
'ssl' => [
'local_cert' => '/etc/nginx/conf.d/ssl/server.pem', // 也可以是crt文件
'local_pk' => '/etc/nginx/conf.d/ssl/server.key',
'verify_peer' => false,
],
],
~~~
現(xiàn)在客戶端就可以通過`https`協(xié)議來連接了。
注意:
* `https`端口必須用`https`協(xié)議訪問,`http`協(xié)議無法訪問。
* 證書一般是與域名綁定的,所以測試的時候請使用域名訪問,不要使用ip。
* 如果使用`https`無法訪問請檢查服務(wù)器防火墻。
也利用`nginx`作為`ssl`的代理,具體配置可以參考[官方手冊說明](http://doc3.workerman.net/315298)。
### 其它注意事項
>[danger] 在`Workerman`下面,不建議直接使用`$_GET`、`$_POST`、`$_REQUEST`、`$_SERVER`、`$_COOKIE`以及`$_SESSION`等原生的PHP用法,推薦使用框架提供的類和方法進行獲取。
由于`onWorkerStart`運行的時候還沒有`HTTP_HOST`,因此最好在應(yīng)用配置文件`config/app.php`中設(shè)置`app_host`。
請不要調(diào)用PHP原生的`header`方法,使用`Response`對象的`header`方法替代。
不要使用PHP原生的`session`相關(guān)函數(shù),使用`Session`類的相關(guān)方法。
### Windows版本問題
`Workerman`的`Windows`版本與`Linux`的主要區(qū)別包括:
* win版本`count`屬性無效,全部為單進程
* 不支持`start`之外的操作命令(可以用`CTRL+C`停止運行)
* cmd命令行啟動,后面可接多個文件,例如 php start_web.php start_gateway.php start_worker.php
* 無法守護進程,cmd窗口關(guān)掉后服務(wù)即停止
## 快速啟動`Workerman Server`
現(xiàn)在來看第二個場景,通過簡單的配置快速啟動一個`Workerman`服務(wù),包括`WebSocket`/`Http`/`Socket`服務(wù)。
可以支持直接啟動一個Workerman server(需要`think-worker`擴展 `2.0.7+`版本)
~~~cmd
php think worker:server
~~~
會顯示如下信息:
~~~
Starting Workerman server...
Workerman[think] start in DEBUG mode
----------------------- WORKERMAN -----------------------------
Workerman version:3.5.13 PHP version:7.2.7-0ubuntu0.18.04.2
------------------------ WORKERS -------------------------------
user worker listen processes status
kancloud thinkphp websocket://0.0.0.0:2345 4 [OK]
----------------------------------------------------------------
Press Ctrl+C to stop. Start success.
~~~
這個時候已經(jīng)在`0.0.0.0:2345`啟動一個`Websocket`服務(wù)。
你可以在瀏覽器中訪問
~~~
http://127.0.0.1:2345
~~~
會看到如下信息:
~~~
400 Bad Request
Sec-WebSocket-Key not found.
This is a WebSocket service and can not be accessed via HTTP.
See http://wiki.workerman.net/Error1 for detail.
~~~
這是因為Workerman的`WebSocket`協(xié)議不支持通過`HTTP`訪問,可以通過JS代碼測試。
~~~
ws = new WebSocket("ws://127.0.0.1:2345");
ws.onopen = function() {
alert("連接成功");
ws.send('hello,thinkphp');
alert("給服務(wù)端發(fā)送一個字符串:hello,thinkphp");
};
ws.onmessage = function(e) {
alert("收到服務(wù)端的消息:" + e.data);
};
~~~
### 守護進程
如果需要使用守護進程方式運行,可以使用
~~~cmd
php think worker:server -d
~~~
### 配置文件
如果需要自定義參數(shù),可以在`config/worker_server.php`中進行配置,包括:
配置參數(shù) | 描述|默認值
--- | --- | ---
protocol| 協(xié)議| websocket
host | 監(jiān)聽地址|0.0.0.0
port | 監(jiān)聽端口|2345
socket | 完整socket地址|空
context | socket 上下文選項|空
daemonize|守護進程|false
>[danger] 注意不要和`worker.php`文件文件混淆,兩者的作用完全不同。
并且支持`Workerman`所有的參數(shù),以及支持使用閉包方式定義相關(guān)事件回調(diào)。
~~~
return [
// 擴展自身需要的配置
'protocol' => 'websocket', // 協(xié)議 支持 tcp udp unix http websocket text
'host' => '0.0.0.0', // 監(jiān)聽地址
'port' => 2345, // 監(jiān)聽端口
// 支持workerman的所有配置參數(shù)
'name' => 'thinkphp',
'count' => 4,
'daemonize' => false,
'pidFile' => Env::get('runtime_path') . 'worker.pid',
// 支持事件回調(diào)
// onWorkerStart
'onWorkerStart' => function ($worker) {
},
// onWorkerReload
'onWorkerReload' => function ($worker) {
},
// onConnect
'onConnect' => function ($connection) {
},
// onMessage
'onMessage' => function ($connection, $data) {
$connection->send('receive success');
},
// onClose
'onClose' => function ($connection) {
},
// onError
'onError' => function ($connection, $code, $msg) {
echo "error [ $code ] $msg\n";
},
];
~~~
### 自定義服務(wù)類
如果你需要更高級的自定義事件回調(diào),也可以使用自定義的`Worker`服務(wù)類。
~~~
<?php
namespace app\http;
use think\facade\Env;
use think\worker\Server;
class Worker extends Server
{
protected $host = '127.0.0.1';
protected $port = 2346;
protected $option = [
'count' => 4,
'pidFile' => Env::get('runtime_path') . 'worker.pid',
'name' => 'think'
];
public function onMessage($connection, $data)
{
$connection->send('receive success');
}
}
~~~
>[danger] 自定義服務(wù)類必須繼承`think\worker\Server`類,支持`workerman`所有的回調(diào)方法定義(回調(diào)方法必須是`public`類型)。
然后在`worker_server.php`中增加配置參數(shù):
~~~
return [
'worker_class' => 'app\http\Worker',
];
~~~
> 定義該參數(shù)后,其它配置參數(shù)均不再有效。
然后就可以在命令行啟動服務(wù)端
~~~cmd
php think worker:server
~~~
一樣可以支持使用守護進程模式運行,
~~~cmd
php think worker:server -d
~~~
同樣也支持`reload`、`restart`和`stop` 操作。
~~~cmd
php think worker:server reload
~~~
### 啟動多個`Workerman`服務(wù)
你可以通過命令行的指令啟動多個不同端口的`workerman`服務(wù),例如:
~~~
php think worker:server -p 2800
php think worker:server -p 2801
~~~
如果要分別對不同端口的服務(wù)進行`stop`操作,務(wù)必使用
~~~
php think worker:server stop -p 2800
php think worker:server stop -p 2801
~~~
如果你自定義了服務(wù)入口類,那么可以定義多個入口類
~~~
<?php
namespace app\http;
use think\facade\Env;
use think\worker\Server;
class Worker1 extends Server
{
protected $host = '127.0.0.1';
protected $port = 2800;
protected $option = [
'count' => 4,
'pidFile' => Env::get('runtime_path') . 'worker1.pid',
'name' => 'think'
];
public function onMessage($connection, $data)
{
$connection->send('receive success');
}
}
~~~
~~~
<?php
namespace app\http;
use think\facade\Env;
use think\worker\Server;
class Worker2 extends Server
{
protected $host = '127.0.0.1';
protected $port = 2801;
protected $option = [
'count' => 4,
'pidFile' => Env::get('runtime_path') . 'worker2.pid',
'name' => 'think'
];
public function onMessage($connection, $data)
{
$connection->send('receive success');
}
}
~~~
然后在`worker_server.php`中增加配置參數(shù):
~~~
return [
'worker_class' => ['app\http\Worker1', 'app\http\Worker2'],
];
~~~
運行啟動指令后可以看到啟動了兩個不同的服務(wù)
~~~cmd
php think worker:server
~~~
## `GatewayWorker`支持
`V2.0.8+`版本開始,`think-worker`擴展可以支持`GatewayWorker`。
> `GatewayWorker`是基于`Workerman`開發(fā)的一套TCP長連接的應(yīng)用框架,實現(xiàn)了單發(fā)、群發(fā)、廣播等接口,內(nèi)置了mysql類庫,`GatewayWorker`分為`Gateway`進程和`Worker`進程,天然支持分布式部署。
>
### 安裝`GatewayWorker`
首先確保你已經(jīng)安裝了`GatewayWorker`,如果還沒有,可以使用下面的命令安裝
~~~
composer require workerman/gateway-worker
~~~
接下來,可以直接在命令行運行
~~~
php think worker:gateway
~~~
會顯示下面的信息,表示啟動成功。
~~~
Starting GatewayWorker server...
Workerman[think] start in DEBUG mode
----------------------- WORKERMAN -----------------------------
Workerman version:3.5.13 PHP version:7.2.7-0ubuntu0.18.04.2
------------------------ WORKERS -------------------------------
user worker listen processes status
kancloud Register text://127.0.0.1:1236 1 [OK]
kancloud BusinessWorker none 1 [OK]
kancloud thinkphp websocket://0.0.0.0:2348 1 [OK]
----------------------------------------------------------------
Press Ctrl+C to stop. Start success.
~~~
### 守護進程模式
如果需要使用守護進程模式,可以使用
~~~
php think worker:gateway -d
~~~
同樣支持在命令行指定地址和端口
~~~
php think worker:gateway -H tp.com -p 2800
~~~
顯示信息
~~~
Starting GatewayWorker server...
Workerman[think] start in DEBUG mode
----------------------- WORKERMAN -----------------------------
Workerman version:3.5.13 PHP version:7.2.7-0ubuntu0.18.04.2
------------------------ WORKERS -------------------------------
user worker listen processes status
kancloud Register text://127.0.0.1:1236 1 [OK]
kancloud BusinessWorker none 1 [OK]
kancloud thinkphp websocket://tp.com:2800 1 [OK]
----------------------------------------------------------------
Press Ctrl+C to stop. Start success.
~~~
### 配置文件
如果需要調(diào)整配置,可以修改配置目錄下面的`gateway_worker.php`文件,內(nèi)容如下:
~~~
return [
// 擴展自身需要的配置
'protocol' => 'websocket', // 協(xié)議 支持 tcp udp unix http websocket text
'host' => '0.0.0.0', // 監(jiān)聽地址
'port' => 2348, // 監(jiān)聽端口
'socket' => '', // 完整監(jiān)聽地址
'context' => [], // socket 上下文選項
'register_deploy' => true, // 是否需要部署register
'businessWorker_deploy' => true, // 是否需要部署businessWorker
'gateway_deploy' => true, // 是否需要部署gateway
// Register配置
'registerAddress' => '127.0.0.1:1236',
// Gateway配置
'name' => 'thinkphp',
'count' => 1,
'lanIp' => '127.0.0.1',
'startPort' => 2000,
'daemonize' => false,
'pingInterval' => 30,
'pingNotResponseLimit' => 0,
'pingData' => '{"type":"ping"}',
// BusinsessWorker配置
'BusinessWorker' => [
'name' => 'BusinessWorker',
'count' => 1,
'eventHandler' => '\think\worker\Events',
],
];
~~~
默認配置參數(shù)如果需要更改,可以直接修改。
> `GatewayWorker`開發(fā)過程中首先要配置`BusinessWorker`下面的`eventHandler`參數(shù)。系統(tǒng)默認提供了一個`think\worker\Events`類作為參考,實際請根據(jù)需要進行調(diào)整。詳細用法請參考[GatewayWorker手冊](http://doc4.workerman.net)。
### 分布式部署
`GatewayWorker`支持分布式部署,假如需要部署三臺服務(wù)器(192.168.1.1-3)提供高可用服務(wù),可以按照下面的方法進行配置操作。
第一臺服務(wù)器運行統(tǒng)一的`Register`服務(wù)(該服務(wù)器同時也運行`Gateway`進程和`BusinessWorker`進程),其它兩臺則只部署`Gateway`服務(wù)和`BusinessWorker`服務(wù),三臺服務(wù)器的`gateway_worker.php`配置文件分別修改為:
192.168.1.1 `gateway_worker.php`
~~~
// 分布式部署配置
'protocol' => 'websocket',
'host' => '0.0.0.0', // 監(jiān)聽地址
'port' => 2348, // 監(jiān)聽端口
'register_deploy' => true, // 部署register
'businessWorker_deploy' => true, // 部署businessWorker
'gateway_deploy' => true, // 部署gateway
// Register配置
'registerAddress' => '192.168.1.1:1236',
// Gateway配置
'name' => 'thinkphp',
'count' => 1,
'lanIp' => '192.168.1.1',
'startPort' => 2000,
'daemonize' => false,
'pingInterval' => 30,
'pingNotResponseLimit' => 0,
'pingData' => '{"type":"ping"}',
// BusinsessWorker配置
'BusinessWorker' => [
'name' => 'BusinessWorker',
'count' => 1,
'eventHandler' => '\think\worker\Events',
],
~~~
192.168.1.2 `gateway_worker.php`
~~~
// 分布式部署配置
'protocol' => 'websocket',
'host' => '0.0.0.0', // 監(jiān)聽地址
'port' => 2348, // 監(jiān)聽端口
'register_deploy' => false, // 不部署register
'businessWorker_deploy' => true, // 部署businessWorker
'gateway_deploy' => true, // 部署gateway
// Register配置
'registerAddress' => '192.168.1.1:1236',
// Gateway配置
'name' => 'thinkphp',
'count' => 1,
'lanIp' => '192.168.1.2',
'startPort' => 2000,
'daemonize' => false,
'pingInterval' => 30,
'pingNotResponseLimit' => 0,
'pingData' => '{"type":"ping"}',
// BusinsessWorker配置
'BusinessWorker' => [
'name' => 'BusinessWorker',
'count' => 1,
'eventHandler' => '\think\worker\Events',
],
~~~
192.168.1.3 `gateway_worker.php`
~~~
// 分布式部署配置
'protocol' => 'websocket',
'host' => '0.0.0.0', // 監(jiān)聽地址
'port' => 2348, // 監(jiān)聽端口
'register_deploy' => false, // 不部署register
'businessWorker_deploy' => true, // 部署businessWorker
'gateway_deploy' => true, // 部署gateway
// Register配置
'registerAddress' => '192.168.1.1:1236',
// Gateway配置
'name' => 'thinkphp',
'count' => 1,
'lanIp' => '192.168.1.3',
'startPort' => 2000,
'daemonize' => false,
'pingInterval' => 30,
'pingNotResponseLimit' => 0,
'pingData' => '{"type":"ping"}',
// BusinsessWorker配置
'BusinessWorker' => [
'name' => 'BusinessWorker',
'count' => 1,
'eventHandler' => '\think\worker\Events',
],
~~~
> 如果你需要把`Gateway`和`BusinessWorker`服務(wù)分開部署,則單獨設(shè)置開啟或者關(guān)閉`gateway_deploy`和`businessWorker_deploy`配置參數(shù)即可。
配置調(diào)整完成后,按順序分別啟動服務(wù),分布式部署完畢。
注意事項及說明:
1、多機部署時以下端口注意不要被服務(wù)器防火墻屏蔽(不知道服務(wù)器防火墻如何配置的請自行搜索資料學習):
①、`Register`服務(wù)監(jiān)聽的端口要可以被其它內(nèi)網(wǎng)服務(wù)器訪問(外網(wǎng)訪問可以屏蔽);
②、如果startPort=2300; count=4;,則2300 2301 2302 2303四個端口需要被設(shè)置成能被其它服務(wù)器訪問。
2、如果多機部署服務(wù)器不在一個局域網(wǎng),部署時ip參數(shù)可以使用外網(wǎng)ip,對應(yīng)端口防火墻應(yīng)該設(shè)置成能被外網(wǎng)服務(wù)器訪問。
3、三臺`GatewayWorker`機器都運行了`Gateway`進程和`Worker`進程,客戶端連接上任意一臺`GatewayWorker`的`Gateway`端口即通訊,開發(fā)。
4、為了方便前端接入和擴容,可以在`Gateway`前加一層DNS、LVS等負載均衡策略(不熟悉DNS LVS的請自行搜索資料學習)。
5、如果服務(wù)器不夠用可以使用同樣的方法增加服務(wù)器
6、如果需要下線服務(wù)器,直接stop對應(yīng)服務(wù)器即可。由于`Gateway`進程維護著客戶端連接,當服務(wù)器下線時,對應(yīng)服務(wù)器的客戶端會掉線一次。
