thinkphp6中怎么使用workerman?下面本篇文章给大家介绍一下thinkphp6整合workerman的教程,希望对大家有所帮助。
thinkphp6整合workerman教程
thinkphp6安装workerman命令:
composer require topthink/think-worker
第一步,创建一个自定义命令类文件,运行指令。【相关推荐:《workerman教程》】
php think make:command Spider spider
会生成一个app\command\Spider
命令行指令类,我们修改内容如下:
<?php namespace app\command; // tp指令特性使用的功能 use think\console\Command; use think\console\Input; use think\console\input\Argument; use think\console\Output; // 引用项目的基类,该类继承自worker use app\server\controller\Start; /** * 指令类 * 在此定义指令 * 再次启动多个控制器 * @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") ->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 * 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', 'onError', '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(); } }
例如我们创建一个定时器的命令app\server\controller创建WebhookTimer.php
<?php namespace app\server\controller; use Workerman\Worker; use \Workerman\Lib\Timer; use think\facade\Cache; use think\facade\Db; use think\Request; 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
在app\command\Spider.php文件
public $controller_names = ['WebhookTimer','其他方法','其他方法'];
其他方法 就是app\server\controller下创建的其他类文件方法
完结
Start.php文件
<?php namespace app\server\controller; use Workerman\Worker; 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: \nstart\t\tStart worker in DEBUG mode.\n\t\tUse mode -d to start in DAEMON mode.\nstop\t\tStop worker.\n\t\tUse mode -g to stop gracefully.\nrestart\t\tRestart workers.\n\t\tUse mode -d to start in DAEMON mode.\n\t\tUse mode -g to stop gracefully.\nreload\t\tReload codes.\n\t\tUse mode -g to reload gracefully.\nstatus\t\tGet worker status.\n\t\tUse mode -d to show live status.\nconnections\tGet 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)) { @unlink(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[H\33[2J\33(B\33[m", true); } // Echo status data. static::safeEcho(static::formatStatusData()); if ($command2 !== '-d') { exit(0); } static::safeEcho("\nPress Ctrl+C to quit.\n\n"); } exit(0); case 'connections': if (is_file(static::$_statisticsFile) && is_writable(static::$_statisticsFile)) { unlink(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); } } }
更多编程相关知识,请访问:编程教学!!
以上是浅析thinkphp6中怎么使用workerman【教程分享】的详细内容。更多信息请关注PHP中文网其他相关文章!

Workerman的Websocket客户端可以通过异步通信,高性能,可伸缩性和安全性等功能增强实时通信,并可以轻松地与现有系统集成。

本文讨论了使用高性能PHP服务器Workerman来构建实时协作工具。它涵盖安装,服务器设置,实时功能实现以及与现有系统集成,强调Workerman的密钥F

本文讨论了针对低延迟应用程序的优化工作人员,重点介绍异步编程,网络配置,资源管理,数据传输最小化,负载平衡和常规更新。

本文讨论了使用Workerman和MySQL实施实时数据同步的,重点是设置,最佳实践,确保数据一致性以及解决共同挑战。

本文讨论了将工作人员集成到无服务器体系结构中,专注于可扩展性,无状态,冷启动,资源管理和集成复杂性。 Workerman通过高并发,降低冷STA来提高性能

文章讨论了使用Workerman建立高性能的电子商务平台,重点关注其功能,例如Websocket支持和可扩展性,以提高实时交互和效率。

Workerman的Websocket服务器可以通过可扩展性,低延迟和针对常见威胁的安全措施等功能增强实时通信。

本文讨论了使用高性能PHP服务器Workerman来构建实时分析仪表板。它涵盖了与React,vue.js和Angular等框架的安装,服务器设置,数据处理以及前端集成。关键功能


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能