首页 > 教程 >
浅析thinkphp6中怎么使用workerman
2023-02-23教程围观次
简介thinkphp6中怎么使用workerman?下面本篇文章给大家介绍一下thinkphp6整合workerman的教程,希望对大家有所帮助。thinkphp6整合workerman教程thinkphp6安装workerman命令:composerrequiretopthink/think-worker第一步,创建一个自定义命令类文件,运行指令。phpthinkmake:commandSpider
thinkphp6中怎么使用 workerman?下面本篇文章给大家介绍一下thinkphp6整合workerman的教程,希望对大家有所帮助。
thinkphp6整合workerman教程
thinkphp6安装workerman命令:
composer require topthink/think-worker
第一步,创建一个自定义命令类文件,运行指令。
php think make:command Spider spider
会生成一个appcommandSpider
命令行指令类,我们修改内容如下:
<?phpnamespace appcommand; // tp指令特性使用的功能use thinkconsoleCommand;use thinkconsoleInput;use thinkconsoleinputArgument;use thinkconsoleOutput; // 引用项目的基类,该类继承自workeruse appservercontrollerStart; /** * 指令类 * 在此定义指令 * 再次启动多个控制器 * @var mixed */class Spider extends Command{ /** * 注册模块名称 * 使用命令会启动该模块控制器 * @var mixed */ public $model_name = 'server'; /** * 注册控制器名称 * 使用命令启动相关控制器 * @var mixed */ public $controller_names = ['WebhookTimer']; /** * 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") ->setDe ion('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 * php think spider start collect/SendMsg */ } /** * execute * tp框架自定义指令特性 * 执行命令后的逻辑 * @param mixed $input * @param mixed $output * @return mixed */ protected function execute(Input $input, Output $output) { //获得status参数,即think自定义指令中的第一个参数,缺省报错 $status = $input->getArgument('status'); if(!$status){ $output->writeln('pelase input control command , like start'); exit; } //获得控制器名称 $controller_str = $input->getArgument('controller_name'); //获得模式,d为wokerman的后台模式(生产环境) $mode = $input->getArgument('mode'); //分析控制器参数,如果缺省或为all,那么运行所有注册的控制器 $controller_list = $this->controller_names; if($controller_str != '' && $controller_str != 'all' ) { $controller_list = explode('/',$controller_str); } //重写mode参数,改为wokerman接受的参数 if($mode == 'd'){ $mode = '-d'; } if($mode == 'g'){ $mode = '-g'; } //将wokerman需要的参数传入到其parseCommand方法中,此方法在start类中重写 Start::$argvs = [ 'think', $status, $mode ]; $output->writeln('start running spider'); $programs_ob_list = []; //实例化需要运行的控制器 foreach ($controller_list as $c_key => $controller_name) { $class_name = 'app\'.$this->model_name.'controller\'.$controller_name; $programs_ob_list[] = new $class_name(); } //将控制器的相关回调参数传到workerman中 foreach (['onWorkerStart', 'onConnect', 'onMessage', 'onClose', ' ', 'onBufferFull', 'onBufferDrain', 'onWorkerStop', 'onWorkerReload'] as $event) { foreach ($programs_ob_list as $p_key => $program_ob) { if (method_exists($program_ob, $event)) { $programs_ob_list[$p_key]->$event = [$program_ob,$event]; } } } Start::runAll(); }}
例如我们创建一个定时器的命令appservercontroller创建WebhookTimer.php
<?phpnamespace appservercontroller;use WorkermanWorker; use WorkermanLibTimer;use thinkfacadeCache;use thinkfacadeDb;use thinkRequest; class WebhookTimer extends Start{ public $host = '0.0.0.0'; public $port = '9527'; public $name = 'webhook'; public $count = 1; public function onWorkerStart($worker) { Timer::add(2, array($this, 'webhooks'), array(), true); } public function onConnect() { } public function onMessage($ws_connection, $message) { } public function onClose() { } public function webhooks() { echo 11; } }
执行start命令行
php think spider start
执行stop命令
php think spider stop
执行全部进程命令
php think spider start all d
在appcommandSpider.php文件
public $controller_names = ['WebhookTimer','其他方法','其他方法'];
其他方法 就是appservercontroller下创建的其他类文件方法
完结
Start.php文件
<?phpnamespace appservercontroller; use WorkermanWorker; class Start extends Worker{ public static $argvs = []; public static $workerHost; public $socket = ''; public $protocol = 'http'; public $host = '0.0.0.0'; public $port = '2346'; public $context = []; public function __construct() { self::$workerHost = parent::__construct($this->socket ?: $this->protocol . '://' . $this->host . ':' . $this->port, $this->context); } /** * parseCommand * 重写wokerman的解析命令方法 * @return mixed */ public static function parseCommand() { if (static::$_OS !== OS_TYPE_LINUX) { return; } // static::$argvs; // Check static::$argvs; $start_file = static::$argvs[0]; $available_commands = array( 'start', 'stop', 'restart', 'reload', 'status', 'connections', ); $usage = "Usage: php yourfile <command> [mode]nCommands: nstartttStart worker in DEBUG mode.nttUse mode -d to start in DAEMON mode.nstopttStop worker.nttUse mode -g to stop gracefully.nrestartttRestart workers.nttUse mode -d to start in DAEMON mode.nttUse mode -g to stop gracefully.nreloadttReload codes.nttUse mode -g to reload gracefully.nstatusttGet worker status.nttUse mode -d to show live status.nconnectionstGet worker connections.n"; if (!isset(static::$argvs[1]) || !in_array(static::$argvs[1], $available_commands)) { if (isset(static::$argvs[1])) { static::safeEcho('Unknown command: ' . static::$argvs[1] . "n"); } exit($usage); } // Get command. $command = trim(static::$argvs[1]); $command2 = isset(static::$argvs[2]) ? static::$argvs[2] : ''; // Start command. $mode = ''; if ($command === 'start') { if ($command2 === '-d' || static::$daemonize) { $mode = 'in DAEMON mode'; } else { $mode = 'in DEBUG mode'; } } static::log("Workerman[$start_file] $command $mode"); // Get master process PID. $master_pid = is_file(static::$pidFile) ? file_get_contents(static::$pidFile) : 0; $master_is_alive = $master_pid && posix_kill($master_pid, 0) && posix_getpid() != $master_pid; // Master is still alive? if ($master_is_alive) { if ($command === 'start') { static::log("Workerman[$start_file] already running"); exit; } } elseif ($command !== 'start' && $command !== 'restart') { static::log("Workerman[$start_file] not run"); exit; } // execute command. switch ($command) { case 'start': if ($command2 === '-d') { static::$daemonize = true; } break; case 'status': while (1) { if (is_file(static::$_statisticsFile)) { @un (static::$_statisticsFile); } // Master process will send SIGUSR2 signal to all child processes. posix_kill($master_pid, SIGUSR2); // Sleep 1 second. sleep(1); // Clear terminal. if ($command2 === '-d') { static::safeEcho("33[H33[2J33(B33[m", true); } // Echo status data. static::safeEcho(static::formatStatusData()); if ($command2 !== '-d') { exit(0); } static::safeEcho("nPress Ctrl+C to quit.nn"); } exit(0); case 'connections': if (is_file(static::$_statisticsFile) && is_writable(static::$_statisticsFile)) { un (static::$_statisticsFile); } // Master process will send SIGIO signal to all child processes. posix_kill($master_pid, SIGIO); // Waiting amoment. usleep(500000); // Display statisitcs data from a disk file. if(is_readable(static::$_statisticsFile)) { readfile(static::$_statisticsFile); } exit(0); case 'restart': case 'stop': if ($command2 === '-g') { static::$_gracefulStop = true; $sig = SIGTERM; static::log("Workerman[$start_file] is gracefully stopping ..."); } else { static::$_gracefulStop = false; $sig = SIGINT; static::log("Workerman[$start_file] is stopping ..."); } // Send stop signal to master process. $master_pid && posix_kill($master_pid, $sig); // Timeout. $timeout = 5; $start_time = time(); // Check master process is still alive? while (1) { $master_is_alive = $master_pid && posix_kill($master_pid, 0); if ($master_is_alive) { // Timeout? if (!static::$_gracefulStop && time() - $start_time >= $timeout) { static::log("Workerman[$start_file] stop fail"); exit; } // Waiting amoment. usleep(10000); continue; } // Stop success. static::log("Workerman[$start_file] stop success"); if ($command === 'stop') { exit(0); } if ($command2 === '-d') { static::$daemonize = true; } break; } break; case 'reload': if($command2 === '-g'){ $sig = SIGQUIT; }else{ $sig = SIGUSR1; } posix_kill($master_pid, $sig); exit; default : if (isset($command)) { static::safeEcho('Unknown command: ' . $command . "n"); } exit($usage); } } }
下载链接:网站源码/小程序源码/网站模板下载