workerman_connection 測試WebStock 功能
Description
整理PHP 實現webstock 功能的相關流程。感謝workerman 開發作者提供開源組件。
安裝 composer
# curl -sS https://getcomposer.org/installer | php
如果安裝 composer 提示PHP 版本不夠按照如下處理,否則跳過。
提示版本不夠,現在是5.3.3 只好準備升級到5.6
先進行卸載舊版本。
# yum list installed | grep php
# yum remove php.x86_64 php-cli.x86_64 php-common.x86_64 php-fpm.x86_64 php-gd.x86_64 php-mbstring.x86_64 php-mcrypt.x86_64 php-mysql.x86_64 php-pdo.x86_64 php-xml.x86_64 刪掉顯示出來的所有組件
接下來安裝PHP5.6
# rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm 升級一下yum 工具
# yum clean all 清除
# yum install php56w.x86_64 php56w-cli.x86_64 php56w-common.x86_64 php56w-fpm.x86_64 php56w-gd.x86_64 php56w-ldap.x86_64 php56w-mbstring.x86_64 php56w-mcrypt.x86_64 php56w-mysql.x86_64 php56w-pdo.x86_64 php56w-xml.x86_64
驗證安裝版本
# php -v (顯示 5.6.35)
# /etc/init.d/php-fpm restart 重新啟動
安裝WebStock 所需要的組件
安裝前檢查很重要
# curl -Ss http://www.workerman.net/check.php|php 檢查缺啥
PHP Version >= 5.3.3 [OK]
Extension pcntl check [OK]
Extension posix check [fail] (缺啥補啥)
補充缺少的部分
# yum install php56w-process 安裝缺少的 posix
# mv composer.phar /usr/local/bin/composer 讓命令全局調用
# cd (切換到項目目錄)
安裝:workerman
# composer require workerman/workerman
安裝:gateway-worker
# composer require workerman/gateway-worker
代碼測試
下載本項目的文件,這里假設你防止的目錄是網站根目錄下 ws 文件夾中。
配置
配置 ws/start_businessworker.php BusinessWorker類其實也是基于基礎的Worker開發的。BusinessWorker是運行業務邏輯的進程,BusinessWorker收到Gateway轉發來的事件及請求時會默認調用Events.php中的onConnect、onMessage、onClose方法處理事件及數據,開發者正是通過實現這些回調控制業務及流程。
$worker->name 是你的工作進程名稱,隨便起名即可別重名
$worker->registerAddress 是webstock 服務器的地址,目標指向你的webstock 服務器,這個在分布式處理需要注意,這里都在一臺主機上測試,所以IP為127.0.0.1
其他不用改,不要動,保存退出
舉例
use \Workerman\Worker;
use \Workerman\WebServer;
use \GatewayWorker\Gateway;
use \GatewayWorker\BusinessWorker;
use \Workerman\Autoloader;
// bussinessWorker 進程
$worker = new BusinessWorker();
// worker名稱
$worker->name = 'YourAppBusinessWorker';
// bussinessWorker進程數量
$worker->count = 4;
// 服務注冊地址
$worker->registerAddress = '127.0.0.1:2346';
// 如果不是在根目錄啟動,則運行runAll方法
if(!defined('GLOBAL_START')) {
Worker::runAll();
}
配置 ws/start_gateway.php Gateway類用于初始化Gateway進程。Gateway進程是暴露給客戶端的讓其連接的進程。所有客戶端的請求都是由Gateway接收然后分發給BusinessWorker處理
$gateway->name
$gateway->count
$gateway->lanIp
$gateway->startPort
$gateway->registerAddress
$gateway->pingInterval
$gateway->pingData
直接看注釋吧。
use \Workerman\Worker;
use \Workerman\WebServer;
use \GatewayWorker\Gateway;
use \GatewayWorker\BusinessWorker;
use \Workerman\Autoloader;
// gateway 進程,這里使用Text協議,可以用telnet測試
$gateway = new Gateway("websocket://0.0.0.0:2345");
// gateway名稱,status方便查看
$gateway->name = 'YourAppGateway';
// gateway進程數
$gateway->count = 4;
// 本機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:2346';
// 心跳間隔
$gateway->pingInterval = 20;
// 心跳數據
$gateway->pingData = '{"type":"ping"}';
配置 ws/start_register.php Register類其實也是基于基礎的Worker開發的。Gateway進程和BusinessWorker進程啟動后分別向Register進程注冊自己的通訊地址,Gateway進程和BusinessWorker通過Register進程得到通訊地址后,就可以建立起連接并通訊了。
要修改的只有text 協議地址,這里面要和
use \Workerman\Worker;
use \GatewayWorker\Register;
// register 服務必須是text協議
$register = new Register('text://0.0.0.0:2346');
// 如果不是在根目錄啟動,則運行runAll方法
if(!defined('GLOBAL_START')) {
Worker::runAll();
}
邏輯工作原理
1.Register、Gateway、BusinessWorker進程啟動
2.Gateway、BusinessWorker進程啟動后向Register服務進程發起長連接注冊自己
3.Register服務收到Gateway的注冊后,把所有Gateway的通訊地址保存在內存中
4.Register服務收到BusinessWorker的注冊后,把內存中所有的Gateway的通訊地址發給BusinessWorker
5.BusinessWorker進程得到所有的Gateway內部通訊地址后嘗試連接Gateway
6.如果運行過程中有新的Gateway服務注冊到Register(一般是分布式部署加機器),則將新的Gateway內部通訊地址列表將廣播給所有BusinessWorker,BusinessWorker收到后建立連接
7.如果有Gateway下線,則Register服務會收到通知,會將對應的內部通訊地址刪除,然后廣播新的內部通訊地址列表給所有BusinessWorker,BusinessWorker不再連接下線的Gateway
8.至此Gateway與BusinessWorker通過Register已經建立起長連接
9.客戶端的事件及數據全部由Gateway轉發給BusinessWorker處理,BusinessWorker默認調用Events.php中的onConnect onMessage onClose處理業務邏輯。
10.BusinessWorker的業務邏輯入口全部在Events.php中,包括onWorkerStart進程啟動事件(進程事件)、onConnect連接事件(客戶端事件)、onMessage消息事件(客戶端事件)、onClose連接關閉事件(客戶端事件)、onWorkerStop進程退出事件(進程事件)
執行測試
進入服務器的ws 目錄下
php start.php start 這會啟動所有服務
啟動后截圖
控制臺截圖
里面會生成一個假的OPEN-ID 這個OPEN-ID 用來溝通這個用戶的客戶端“OPENID_1539063500148”
查看客戶端控制臺
看到消息表示測試成功。
特別說明
send_message.php 中的代碼實際上放到任何框架下都可以執行,這個完美的進行了解耦操作。