# ThinkPHP 5.1 Workerman 快速上手指南
本篇內容主要講述了最新的`think-worker`擴展的使用。
[TOC=2,3]
>[info] 本指南的目的不是為了讓你掌握`Workerman`開發,而且幫助你使用`think-worker`快速部署`ThinkPHP5.1`應用到`Workerman`的`HttpServer`,以及使用快速啟動`Workerman`服務(包括`GatewayWorker`),如果你需要了解`Workerman`的具體用法和原理,請參考[Workerman官方文檔](http://doc3.workerman.net/),說的比較詳細了。
>
>[danger]#### 本文的內容并不適用于ThinkPHP `5.0`及以下版本 !如果你發現文中的例子沒法正確執行,請檢查你的think-worker擴展是否已經更新到最新版本。
## 安裝`Workerman`和`think-worker`
> Workerman是一款純PHP開發的開源高性能的PHP socket 服務器框架。而 `think-worker`則是ThinkPHP官方發布的一個`workerman`擴展,從`2.0+`版本完善了對`Workerman`的支持。
>
`Workerman`是一個純PHP的實現,因此基本上不需要特殊的安裝,你只需要通過`composer`直接安裝即可。
~~~
composer require workerman/workerman
~~~
> 注意,最新版本的workerman已經統一了Linux和Windows版本,因此不需要單獨安裝windows版本了。
事實上在安裝`think-worker`擴展的時候會自動安裝`workerman`依賴包,所以直接在你的項目根目錄下運行下面的命令安裝擴展,如果你還沒有安裝`workerman`的話也會自動安裝。
~~~
composer require topthink/think-worker
~~~
本文中的內容以最新版本的擴展為例(最好確保安裝的是`V2.0.8+`版本,可能部分功能老版本的擴展不支持),如果你的擴展版本較舊,請更新框架或者擴展版本。
`ThinkPHP5+`的擴展都是基于`Composer`安裝的,所以確認你已經安裝了`Composer`。
如果你已經有自己的ThinkPHP`5.1`項目了,為了支持最新的特性,**建議更新到最新版本**(`V5.1.20+`),然后可以在應用根目錄下使用下面命令安裝擴展。
~~~
composer require topthink/think-worker
~~~
會安裝最新的穩定版本的`think-worker`擴展。
如果你是第一次使用ThinkPHP`5.1`,那么可以先創建一個初始項目,然后再安裝擴展,依次執行下面的命令即可。
~~~
composer create-project topthink/think tp
cd tp
composer require topthink/think-worker
~~~
## 啟動`Workerman HTTP`服務
第一個場景(也是該擴展最重要的一個場景),畢竟大部分使用`think-worker`擴展的用戶都是在使用ThinkPHP開發網站或者項目,使用`think-worker`擴展可以讓你的產品直接部署到`Workerman`上,并且享受下面的優勢:
* 無需對代碼進行改造就能帶來性能的數倍提升;
* 可以在`Apache`/`Nginx`等傳統WEB服務器和`Workerman`之間切換部署;
> 簡單點說,就是你可以在傳統模式下開發你的應用,然后直接部署到`Workerman`上運行,但無需針對`Workerman`寫任何的處理代碼。
安裝完擴展后,你什么都不需要做,最簡單的就是直接在命令行(應用根目錄下面)下執行:
~~~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.
~~~
可以看到已經在`0.0.0.0:2346`啟動一個HTTP Server服務端(默認啟動的是調試模式),下面我們可以直接訪問當前的應用。
~~~
http://localhost:2346
~~~
如果你之前已經有運行一個80端口的WEB服務,可以同時訪問,你也可以比較下兩個頁面的區別。
如果你是剛創建的項目,那么可以直接看到ThinkPHP`5.1`的歡迎頁面。

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