tp5.1集成workerman将业务代码放到控制器并且可以使用命令启动多个业务代码

本文介绍了如何在Linux环境下,使用ThinkPHP5.1集成Workerman实现将业务代码放在控制器中,并通过自定义命令启动多个控制器。文章详细讲解了需求目标、Workerman的系统兼容性、ThinkPHP自定义指令的创建过程,以及如何编写业务代码。最后展示了最终运行效果,强调了在Linux下可以启动多个业务控制器,而在Windows下则需要多个文件来实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前写过一篇博客,介绍把wokerman的回调函数定义到thinkphp的控制其中,并通过命令启动.

tp5.1最新版集成workerman如何自定义命令并把业务逻辑写到控制器里

但是有局限性,那篇文章是在windows下实现的,linux不能直接使用,并且一次命令只能启动一个控制器,就是说你有两个控制器需要后台启动,无法用一条命令启动.本片文章为解决这个需求的解决方案.但是只适合linux版本.不兼容windwos.

需求目标

  • 把业务逻辑写到控制器里
  • 不同的业务写到不同的控制器
  • 可以通过命令启动指定或全部的业务代码

即以下命令可以启动getPageHref和getPageSrc两个控制器代码

php think spider start GetPageHref/GetPageSrc

上面命令运行的效果(每个控制器也可以启动不同的进程数,但这都是在业务代码实现的),命令行可以选择启动不同的代码或全部代码.

workerman系统兼容介绍

workerman的windwos版本和linux核心逻辑不同,在解析命令,使用扩展,子进程方式都不同,在实现如题需求时遇到以下兼容问题:

  • 解析命令不同,具体可查看两个版本的worker文件
  • 启动扩展不同,linux使用了posix扩展
  • 子进程方式不同,其导致了windwos不能在同一文件启动多个woker,也让在linux下如题需求得以解决,具体参见手册.入口

thinkphp自定义指令

详细请参考手册.

为了定义该命令,我们修改了application/command.php文件如下

return [
    'app\common\command\Spider',
];

建立相关目录文件:

Spider.php的基本指令代码,等下会有全部的代码,可以复制使用.

/**
     * configure
     * tp框架自定义指令特性
     * 注册命令参数
     * @return mixed 
     */
    protected function configure()
    {
        $this->setName('spider')
            ->addArgument('status', Argument::OPTIONAL, "status")
            ->addArgument('controller_name', Argument::OPTIONAL, "controller_name/controller_name")
            ->addArgument('mode', Argument::OPTIONAL, "d")
            ->setDescription('spider control');
            
            /**
             * 以上设置命令格式为:php think spider [status] [controller_name/controller_name] [d]
             * think        为thinkphp框架入口文件
             * spider       为在框架中注册的命令,上面setName设置的
             * staus        为workerman框架接受的命令
             * controller_name/controller_name      为控制器名称,以正斜线分割,执行制定控制器,为空或缺省则启动所有控制器,控制器列表在controller_name属性中注册
             * d            最后一个参数为wokerman支持的-d-g参数,但是不用加-,直接使用d或者g
             */
    }

上面的代码是thinkphp的特性所支持的内容,基本的内容是,设置指令名称为"spider"并接受其他参数,

以上设置可以接受以下形式的命令.

php think spider start
php think spider start all d
php think spider start GetPageHref d

介绍逻辑

运行中,我们发现workerman原生地解析命令行方法不适用,所以需要重写,因此:

  • 新建一个Start.php控制器当作业务基类.
  • 该控制器继承worker.
  • 该控制器重写parseCommand()方法.
  • 为了实现重写,添加静态属性argvs.

start.php代码,该部分代

### ThinkPHP 5.1集成 Workerman 及 Gateway 进行开发 #### 创建项目并安装依赖 为了在 ThinkPHP 5.1集成 WorkerMan 和 Gateway,首先需要创建一个新的 ThinkPHP 项目: ```bash composer create-project topthink/think=5.1.x-dev tp5 [^1] ``` 进入项目目录 `tp5` 并通过 Composer 安装 WorkerMan 和 GatewayWorker 扩展包。 ```bash cd tp5 composer require workerman/gateway-worker ``` #### 配置 WorkerMan 启动文件 在项目的根目录下创建一个名为 `start.php` 的启动脚本用于运行 WorkerMan 服务端程序。此文件内容如下所示: ```php <?php // start.php 文件路径位于项目根目录 use GatewayWorker\Lib\Gateway; require_once __DIR__ . '/vendor/autoload.php'; $worker = new \GatewayWorker\BusinessWorker(); $worker->count = 4; // 设置进程数 $worker->name = 'Chat'; // 名字 $worker->registerAddress = '127.0.0.1:1238'; $worker->eventHandler = '\App\WebSocketEventHandler'; // 自定义事件处理器类名空间位置 // 如果不是在根目录启动,则运行runAll方法 if (!defined('GLOBAL_START')) { Worker::runAll(); } ``` 注意这里指定了自定义的 WebSocket 事件处理类 `\App\WebSocketEventHandler` ,该类应该放置于应用命名空间下的适当位置以便加载器能够找到它。 #### 实现 WebSocket 逻辑 接下来,在应用程序内实现具体的业务逻辑。假设已经按照上述配置设置了 `$worker->eventHandler` 属性指向了一个特定的 PHP 类来负责接收来自客户端的消息以及向其发送消息等功能。那么可以在 `app/` 下新建相应的 PHP 文件比如命名为 `WebSocketEventHandler.php` 来编写实际功能代码: ```php <?php namespace App; class WebSocketEventHandler extends \GatewayWorker\GateWay { public static function onConnect($client_id) { echo "new connection from {$client_id}\n"; } /** * 当收到客户端发来的数据时触发 */ public static function onMessage($client_id, $message) { // 发送 hello world 给当前连接上的客户端 self::sendToClient($client_id,'hello world'); // 将 client_id 和 uid 关联起来 \GatewayWorker\Lib\Gateway::bindUid($client_id, uniqid()); } protected static function sendToClient($client_id,$msg){ global $_GW_; $_GW_->gateway->sendToClient($client_id,json_encode(['type'=>'chat','content'=>$msg])); } /** * 当有客户端断开链接的时候触发 */ public static function onClose($client_id) { echo "connection closed\n"; } } ``` 这段代码实现了当新用户加入聊天室(`onConnect`)、接收到消息(`onMessage`)和离开房间(`onClose`)三个主要场景下的行为响应函数,并且包含了简单的绑定 UID 到 Client ID 的操作[^3]。 #### 测试 Websocket 功能 完成以上设置之后就可以尝试重启 WorkerMan 服务器以使更改生效。对于 Windows 用户来说可以执行之前提到过的批处理命令 `start_for_win.bat` 来开启服务[^2];而对于 Linux 或 MacOSX 系统则可以直接利用命令行工具 php 去调用刚才建立好的入口文件 `php start.php start -d` (其中 `-d` 参数表示以后台守护模式运行)。 最后一步就是验证整个系统的正常运作情况了——可以通过浏览器或其他支持 WebSocket 协议的应用模拟作为客户端发起请求并与后端交互从而检验是否成功搭建起了基于 TP5 + WorkerMan/Gateway 构建而成的服务架构体系。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值