start_gateway.php代碼:
<?php
use \Workerman\Worker;
use \Workerman\WebServer;
use \GatewayWorker\Gateway;
use \GatewayWorker\BusinessWorker;
use \Workerman\Autoloader;
// 自動加載類
require_once __DIR__ . '/../../vendor/autoload.php';
// gateway 進(jìn)程,這里使用Text協(xié)議,可以用telnet測試
// $gateway = new Gateway("tcp://0.0.0.0:8282");
$gateway = new Gateway("websocket://0.0.0.0:2000");
// gateway名稱,status方便查看
$gateway->name = 'Device';
// gateway進(jìn)程數(shù)
$gateway->count = 1;
// 本機(jī)ip,分布式部署時使用內(nèi)網(wǎng)ip
$gateway->lanIp = '127.0.0.1';
// 內(nèi)部通訊起始端口,假如$gateway->count=4,起始端口為4000
// 則一般會使用4000 4001 4002 4003 4個端口作為內(nèi)部通訊端口
$gateway->startPort = 2900;
// 服務(wù)注冊地址
$gateway->registerAddress = '127.0.0.1:1238';
// 心跳間隔
$gateway->pingInterval = 10;
$gateway->pingNotResponseLimit = 1;
// 心跳數(shù)據(jù)
//$gateway->pingData = '{"type":"ping"}';
$gateway->pingData = '';
$db = new \Workerman\MySQL\Connection('host', '3306', 'username', 'password', 'dbName');
// 當(dāng)客戶端連接上來時,設(shè)置連接的onWebSocketConnect,即在websocket握手時的回調(diào)
$gateway->onConnect = function($connection)
{
$connection->onWebSocketConnect = function($connection , $http_header)
{
global $db;
// $_SERVER 可用這里判斷連接來源是否合法,不合法就關(guān)掉連接
try
{
// 查詢數(shù)據(jù)庫設(shè)備Token是否存在
// 查詢數(shù)據(jù)庫設(shè)備Token是否存在
// 查詢數(shù)據(jù)庫設(shè)備Token是否存在
// 查詢數(shù)據(jù)庫設(shè)備Token是否存在
// 查詢數(shù)據(jù)庫設(shè)備Token是否存在
// 查詢數(shù)據(jù)庫設(shè)備Token是否存在
}
catch (\Exception $e)
{
echo $e->getMessage();
$connection->close();
}
};
};
// 如果不是在根目錄啟動,則運行runAll方法
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
events.php 代碼
<?php
/**
* 用于檢測業(yè)務(wù)代碼死循環(huán)或者長時間阻塞等問題
* 如果發(fā)現(xiàn)業(yè)務(wù)卡死,可以將下面declare打開(去掉//注釋),并執(zhí)行php start.php reload
* 然后觀察一段時間workerman.log看是否有process_timeout異常
*/
//declare(ticks=1);
use \GatewayWorker\Lib\Gateway;
use Workerman\Worker;
class Events
{
public static $db = null;
public static function onWorkerStart($worker)
{
self::$db = new \Workerman\MySQL\Connection('host', '3306', 'username', 'password', 'dbName');
}
// 當(dāng)客戶端連接時觸發(fā)
public static function onConnect($client_id)
{
// 向當(dāng)前client_id發(fā)送數(shù)據(jù)
Gateway::sendToClient($client_id, "Hello $client_id\r\n");
// 向所有人發(fā)送
Gateway::sendToAll("$client_id login\r\n");
}
// 當(dāng)客戶端發(fā)來消息時觸發(fā)
public static function onMessage($client_id, $message)
{
// 設(shè)置workerman處理一定請求后重啟當(dāng)前進(jìn)程
static $request_count;
if(++$request_count > 100)
{
// 請求數(shù)達(dá)到10000后退出當(dāng)前進(jìn)程,主進(jìn)程會自動重啟一個新的進(jìn)程
Worker::stopAll();
}
}
// 當(dāng)用戶斷開連接時觸發(fā)
public static function onClose($client_id)
{
echo $client_id.'斷開了'.PHP_EOL;
}
}
兩個頁面都需要查詢數(shù)據(jù)庫