


Une brève analyse de la façon d'utiliser Workerman dans thinkphp6 [partage du didacticiel]
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); } } }
更多编程相关知识,请访问:编程教学!!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Pour exécuter le projet ThinkPHP, vous devez : installer Composer ; utiliser Composer pour créer le projet ; entrer dans le répertoire du projet et exécuter php bin/console serve ; visiter http://localhost:8000 pour afficher la page d'accueil.

ThinkPHP dispose de plusieurs versions conçues pour différentes versions de PHP. Les versions majeures incluent 3.2, 5.0, 5.1 et 6.0, tandis que les versions mineures sont utilisées pour corriger les bogues et fournir de nouvelles fonctionnalités. La dernière version stable est ThinkPHP 6.0.16. Lorsque vous choisissez une version, tenez compte de la version PHP, des exigences en matière de fonctionnalités et du support de la communauté. Il est recommandé d'utiliser la dernière version stable pour de meilleures performances et une meilleure assistance.

Pour implémenter le téléchargement et le téléchargement de fichiers dans des documents Workerman, des exemples de code spécifiques sont requis Introduction : Workerman est un framework de communication réseau asynchrone PHP hautes performances, simple, efficace et facile à utiliser. Dans le développement réel, le téléchargement et le téléchargement de fichiers sont des exigences fonctionnelles courantes. Cet article explique comment utiliser le framework Workerman pour implémenter le téléchargement et le téléchargement de fichiers, et donne des exemples de code spécifiques. 1. Téléchargement de fichiers : le téléchargement de fichiers fait référence à l'opération de transfert de fichiers de l'ordinateur local vers le serveur. Ce qui suit est utilisé

Étapes pour exécuter ThinkPHP Framework localement : Téléchargez et décompressez ThinkPHP Framework dans un répertoire local. Créez un hôte virtuel (facultatif) pointant vers le répertoire racine ThinkPHP. Configurez les paramètres de connexion à la base de données. Démarrez le serveur Web. Initialisez l'application ThinkPHP. Accédez à l'URL de l'application ThinkPHP et exécutez-la.

Étapes d'installation de ThinkPHP : Préparez les environnements PHP, Composer et MySQL. Créez des projets à l'aide de Composer. Installez le framework ThinkPHP et ses dépendances. Configurez la connexion à la base de données. Générez le code de l'application. Lancez l'application et visitez http://localhost:8000.

Comparaison des performances des frameworks Laravel et ThinkPHP : ThinkPHP fonctionne généralement mieux que Laravel, en se concentrant sur l'optimisation et la mise en cache. Laravel fonctionne bien, mais pour les applications complexes, ThinkPHP peut être mieux adapté.

Swoole et Workerman sont tous deux des frameworks de serveur PHP hautes performances. Connu pour son traitement asynchrone, ses excellentes performances et son évolutivité, Swoole convient aux projets qui doivent gérer un grand nombre de requêtes simultanées et un débit élevé. Workerman offre la flexibilité des modes asynchrone et synchrone, avec une API intuitive mieux adaptée à la facilité d'utilisation et aux projets gérant des volumes de concurrence inférieurs.

"Suggestions de développement : comment utiliser le framework ThinkPHP pour implémenter des tâches asynchrones" Avec le développement rapide de la technologie Internet, les applications Web ont des exigences de plus en plus élevées pour gérer un grand nombre de requêtes simultanées et une logique métier complexe. Afin d'améliorer les performances du système et l'expérience utilisateur, les développeurs envisagent souvent d'utiliser des tâches asynchrones pour effectuer certaines opérations chronophages, telles que l'envoi d'e-mails, le traitement des téléchargements de fichiers, la génération de rapports, etc. Dans le domaine de PHP, le framework ThinkPHP, en tant que framework de développement populaire, offre des moyens pratiques d'implémenter des tâches asynchrones.
