有时候我们希望使用workerman的能力,但同时也希望使用thinkphp的各项能力。这时候我们可以把workerman集成到框架中,封装一个命令。

可以复制下面的代码到项目中,最终实现的效果如下:

  1. php think worker start|stop|restart|reload|status|connections

如果需要后台运行,则:

  1. php think worker start --mode d

首先引入workerman。

  1. composer require workerman/workerman

定义一个Tp的命令行指令文件,可以自己创建,也可以把下面的代码复制到app/command/Server.php,然后再console.php引入该文件。

然后把业务代码写到:app/worker/chatServer/下,这里的代码都要复合start*.php的规则,都要以start开头,这些文件,不需要写命名空间,不需要符合psr规则,按照workerman的写法来写就行,如果不希望讲这些代码放到app目录下,可以修改下面的启动文件。

  • command.php
<?php

declare(strict_types=1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use Workerman\Worker;

class Server extends Command
{

    protected $commandName = 'chatServer';
  
    protected function configure()
    {
        // 指令配置
        $this->setName('worker')
            ->addArgument('action', Argument::OPTIONAL, "start|stop|restart|reload|status|connections", 'start')
            ->addOption('mode', 'm', Option::VALUE_OPTIONAL, 'Run the workerman server in daemon mode.')
            ->setDescription('the workerman command');
    }

    protected function execute(Input $input, Output $output)
    {
        // 指令输出
        $output->writeln('worker start');

        $action = $input->getArgument('action');
        $mode = $input->getOption('mode');


        // 重新构造命令行参数,以便兼容workerman的命令
        global $argv;

        $argv = [];

        array_unshift($argv, 'think', $action);
        if ($mode == 'd') {
            $argv[] = '-d';
        } else if ($mode == 'g') {
            $argv[] = '-g';
        }


        if (strpos(strtolower(PHP_OS), 'win') === 0) {
            exit("start.php not support windows, please use start_for_win.bat\n");
        }

        // 检查扩展
        if (!extension_loaded('pcntl')) {
            exit("Please install pcntl extension. See http://doc3.workerman.net/appendices/install-extension.html\n");
        }

        if (!extension_loaded('posix')) {
            exit("Please install posix extension. See http://doc3.workerman.net/appendices/install-extension.html\n");
        }

        // 标记是全局启动
        define('GLOBAL_START', 1);

        foreach (glob(app()->getBasePath() . '/worker/'. $this->commandName .'/start*.php') as $start_file) {
            require_once $start_file;
        }

        Worker::runAll();
    }
}

原文标题:接入workerman和命令参数

原文文档:ulthon_admin

原文地址:https://doc.ulthon.com/read/augushong/ulthon_admin/639fc93dcc3a1/zh-cn/2.x.html

原文平台:奥宏文档

2.x