先把composer调成国内镜像:
composer config -g repo.packagist composer https://packagist.phpcomposer.com
不更换也行,但是很慢,建议更换
进项目根目录(不是public)
composer require workerman/gateway-worker
装完后,在public里新建一个php文件:chat.php
<?php // [ 应用入口文件 ] // 定义应用目录 define('APP_PATH', __DIR__ . '/../application/'); //此处为绑定的模块 define('BIND_MODULE','push/Start'); // 加载框架引导文件 require __DIR__ . '/../thinkphp/start.php';
然后在 application 里创建一个 文件夹:push
在push下再创建一个controller文件夹
再创建两个文件:Start.php、Events.php
Start.php:
<?php namespace apppushcontroller; use WorkermanWorker; use GatewayWorkerRegister; use GatewayWorkerBusinessWorker; use GatewayWorkerGateway; class Start { public function __construct() { //定义端口 $port = 2500; // 初始化register new Register('text://0.0.0.0:' . $port); //初始化 bussinessWorker 进程 $worker = new BusinessWorker(); $worker->name = 'chatWorker'; //进程名 $worker->count = 4; //进程数 $worker->registerAddress = '127.0.0.1:' . $port; // 设置处理业务的类,此处制定Events的命名空间 $worker->eventHandler = 'apppushcontrollerEvents'; // 初始化 gateway 进程 $gateway = new Gateway("websocket://0.0.0.0:2501"); $gateway->name = 'chatGateway'; //Gateway进程名 $gateway->count = 4; //Gateway进程数 $gateway->lanIp = '127.0.0.1'; $gateway->startPort = 2000; //开始端口 // $gateway->pingInterval = 60; // $gateway->pingNotResponseLimit = 5; // $gateway->pingData = 'pong'; $gateway->registerAddress = '127.0.0.1:' . $port; // 运行所有Worker; Worker::runAll(); } }
Events.php
<?php namespace apppushcontroller; use WorkermanWorker; use appcommoncontrollerFrontend; use GatewayWorkerLibGateway;class Events extends Frontend { /** * 有消息时 * @param integer $client_id 连接的客户端 * @param mixed $message * @return void */ public static function onMessage($client_id, $message) { //$uid = 1; //Gateway::bindUid($client_id, $uid); //与用户id绑定 dump($message); //在sell控制台可查看到打印的内容 //把接收到的消息原样返回 Gateway::sendToClient($client_id, $message); } /** * 当用户连接时触发的方法 * @param integer $client_id 连接的客户端 * @return void */ public static function onConnect($client_id) { echo '连接成功' . PHP_EOL; Gateway::sendToClient($client_id, '连接成功'); } /** * 当用户断开连接时触发的方法 * @param integer $client_id 断开连接的客户端 * @return void */ public static function onClose($client_id) { echo '断开连接' . PHP_EOL; Gateway::sendToClient($client_id, "断开连接"); // Gateway::sendToAll("client[$client_id] logout "); } /** * 当进程启动时 * @param integer $businessWorker 进程实例 */ public static function onWorkerStart($businessWorker) { echo '进程启动,进程id:' . $businessWorker->id . PHP_EOL; } /** * 当进程关闭时 * @param integer $businessWorker 进程实例 */ public static function onWorkerStop($businessWorker) { echo '进程关闭,进程id:' . $businessWorker->id . PHP_EOL; } }
做完这些,便可以去sell控制台输入命令运行:
cd 到 public 目录下,然后:
php ./chat.php start
已启动完毕,可以使用在线的websocket测试工具试试,连的时候,是连接端口为:2501 这个。
报错信息都是在这个sell界面查看