使用composer安裝, 所以先要確保安裝了composer工具
1. 爲了安裝快, 安裝一個composer擴展hirak/prestissimo, 可以多線程下載
composer global require hirak/prestissimo
2. 設置鏡像地址爲阿里雲(使用官方鏡像會有被牆資源, 安裝很可能失敗)
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
3. 安裝laravel, 我選擇了最新版7.x
composer create-project laravel/laravel my-project--prefer-dist "7.*.*"
4. 安裝 gateway-worker
composer require workerman/gateway-worker
安裝完gateway-worker, 在vendor目錄會看到workman目錄, 如下圖:
5. 創建 Workerman 啓動文件
5.1 用artisan命令創建command文件
// 創建一個artisan command文件
// 生成的文件路徑: Console\Commands\GatewayWorkerServer.php
php artisan make:command GatewayWorkerServer
生成文件 如下圖結構:
5.2 GatewayWorkerServer.php 寫入以下內容
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use GatewayWorker\BusinessWorker;
use GatewayWorker\Gateway;
use GatewayWorker\Register;
use Workerman\Worker;
class GatewayWorkerServer extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'workman {action} {--d}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Start a Workerman server.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
global $argv;
$action = $this->argument('action');
$argv[0] = 'artisan workman';
$argv[1] = $action;
$argv[2] = $this->option('d') ? '-d' : ''; //必須是一個-,上面定義命令兩個--,後臺啓動用兩個--
$this->start();
}
private function start()
{
$this->startGateWay();
$this->startBusinessWorker();
$this->startRegister();
Worker::runAll();
}
private function startBusinessWorker()
{
$worker = new BusinessWorker();
$worker->name = 'BusinessWorker';
$worker->count = 1;
$worker->registerAddress = '127.0.0.1:1236';
$worker->eventHandler = \App\GatewayWorker\Events::class;
}
private function startGateWay()
{
$gateway = new Gateway("websocket://0.0.0.0:2346");
$gateway->name = 'Gateway';
$gateway->count = 1;
$gateway->lanIp = '127.0.0.1';
$gateway->startPort = 2300;
$gateway->pingInterval = 30;
$gateway->pingNotResponseLimit = 0;
$gateway->pingData = '{"type":"ping"}';
$gateway->registerAddress = '127.0.0.1:1236';
}
private function startRegister()
{
new Register('text://0.0.0.0:1236');
}
//php artisan workman start --d 之後 打開瀏覽器F12 將內容複製到console裏return就行
/* ws = new WebSocket("ws://192.168.136.128:2346");
ws.onopen = function() {
ws . send('{"name":"one","user_id":"111"}');
ws . send('{"name":"two","user_id":"222"}');
};
ws.onmessage = function(e) {
console.log("收到服務端的消息:" + e.data);
};
ws.onclose = function(e) {
console.log("服務已斷開" );
};*/
}
6. 創建事件監聽文件
在app目錄下新建目錄GatewayWorker, 然後在該目錄下新建文件Events.php , 然後寫入以下內容
<?php
/**
* Created by PhpStorm.
* User: dozhihong
* Date: 2020/5/3
* Time: 15.19
*/
namespace App\GatewayWorker;
use GatewayWorker\Lib\Gateway;
use Illuminate\Support\Facades\Log;
class Events
{
public static function onWorkerStart($businessWorker)
{
echo "onWorkerStart\r\n";
}
public static function onConnect($client_id)
{
Gateway::sendToClient($client_id, json_encode(['type' => 'onConnect', 'client_id' => $client_id]));
echo "onConnect\r\n";
}
public static function onWebSocketConnect($client_id, $data)
{
echo "onWebSocketConnect\r\n";
}
public static function onMessage($client_id, $message)
{
Gateway::sendToClient($client_id, json_encode(['type' => 'onMessage', 'client_id' => $client_id, 'name' => json_decode($message)->name]));
echo "onMessage\r\n";
}
public static function onClose($client_id)
{
Log::info('Workerman close connection' . $client_id);
echo "onClose\r\n";
}
}
7. 測試
7.1 部署一臺linux服務器
打開php禁用函數
1. pcntl_fork()
2. pcntl_wait()
3. pcntl_signal_dispatch()
4. pcntl_signal()
5. pcntl_alarm()
運營商服務器控制面板 入站規則, 放開端口
TCP:2346
如圖:
linux防火牆放行 2346, 這裏使用寶塔面板, 直接在裏面放行, 如下圖
說明: 需要放行的端口, 就是GatewayWorkerServer.php中, new Gateway(“websocket://0.0.0.0:2346”); 中所寫的端口
7.2 把代碼部署在linux服務器上
7.3 啓動workman
/www/server/php/73/bin/php artisan workman
7.4 測試連接
打開瀏覽器, 輸入網站隨便一個頁面, F12打開控制檯, 輸入代碼
ws = new WebSocket("ws://58.87.95.128:2346")
觀查network,Status爲101, 就是成功
如圖:
PS: 在這過程中, 會有很多小夥伴遇到客戶端連接失敗問題 , workman官方總結的很到位, 地址: http://doc.workerman.net/faq/client-connect-fail.html