淺析thinkphp6中怎么使用workerman【教程分享】

thinkphp6中怎么使用workerman?下面本篇文章給大家介紹一下thinkphp6整合workerman的教程,希望對大家有所幫助。

淺析thinkphp6中怎么使用workerman【教程分享】

thinkphp6整合workerman教程

thinkphp6安裝workerman命令:

composer?require?topthink/think-worker

第一步,創(chuàng)建一個自定義命令類文件,運行指令。【相關推薦:《workerman教程》】

立即學習PHP免費學習筆記(深入)”;

php?think?make:command?Spider?spider

會生成一個appcommandSpider命令行指令類,我們修改內(nèi)容如下:

<?php namespace appcommand;   // tp指令特性使用的功能 use thinkconsoleCommand; use thinkconsoleInput; use thinkconsoleinputArgument; use thinkconsoleOutput;   // 引用項目的基類,該類繼承自worker use appservercontrollerStart;   /**  * 指令類  * 在此定義指令  * 再次啟動多個控制器  * @var mixed  */ class Spider extends Command {       /**      * 注冊模塊名稱      * 使用命令會啟動該模塊控制器      * @var mixed      */     public $model_name = &#39;server&#39;;       /**      * 注冊控制器名稱      * 使用命令啟動相關控制器      * @var mixed      */     public $controller_names = [&#39;WebhookTimer&#39;];       /**      * configure      * tp框架自定義指令特性      * 注冊命令參數(shù)      * @return mixed      */     protected function configure()     {         $this->setName('spider') ????????????-&gt;addArgument('status',?Argument::OPTIONAL,?"status") ????????????-&gt;addArgument('controller_name',?Argument::OPTIONAL,?"controller_name/controller_name") ????????????-&gt;addArgument('mode',?Argument::OPTIONAL,?"d") ????????????-&gt;setDescription('spider?control'); ? ????????/** ?????????*?以上設置命令格式為:php?think?spider?[status]?[controller_name/controller_name]?[d] ?????????*?think????????為thinkphp框架入口文件 ?????????*?spider???????為在框架中注冊的命令,上面setName設置的 ?????????*?staus????????為workerman框架接受的命令 ?????????*?controller_name/controller_name??????為控制器名稱,以正斜線分割,執(zhí)行制定控制器,為空或缺省則啟動所有控制器,控制器列表在controller_name屬性中注冊 ?????????*?d????????????最后一個參數(shù)為wokerman支持的-d-g參數(shù),但是不用加-,直接使用d或者g ?????????*?php?think?spider?start?collect/SendMsg ?????????*/ ????} ? ? ????/** ?????*?execute ?????*?tp框架自定義指令特性 ?????*?執(zhí)行命令后的邏輯 ?????*?@param?mixed?$input ?????*?@param?mixed?$output ?????*?@return?mixed ?????*/ ????protected?function?execute(Input?$input,?Output?$output) ????{ ? ????????//獲得status參數(shù),即think自定義指令中的第一個參數(shù),缺省報錯 ????????$status??=?$input-&gt;getArgument('status'); ????????if(!$status){ ????????????$output-&gt;writeln('pelase?input?control?command?,?like?start'); ????????????exit; ????????} ? ? ????????//獲得控制器名稱 ????????$controller_str?=??$input-&gt;getArgument('controller_name'); ? ????????//獲得模式,d為wokerman的后臺模式(生產(chǎn)環(huán)境) ????????$mode?=?$input-&gt;getArgument('mode'); ? ????????//分析控制器參數(shù),如果缺省或為all,那么運行所有注冊的控制器 ????????$controller_list?=?$this-&gt;controller_names; ? ????????if($controller_str?!=?''?&amp;&amp;?$controller_str?!=?'all'?) ????????{ ????????????$controller_list?=?explode('/',$controller_str); ????????} ? ????????//重寫mode參數(shù),改為wokerman接受的參數(shù) ????????if($mode?==?'d'){ ????????????$mode?=?'-d'; ????????} ? ????????if($mode?==?'g'){ ????????????$mode?=?'-g'; ????????} ? ????????//將wokerman需要的參數(shù)傳入到其parseCommand方法中,此方法在start類中重寫 ????????Start::$argvs?=?[ ????????????'think', ????????????$status, ????????????$mode ????????]; ? ????????$output-&gt;writeln('start?running?spider'); ? ????????$programs_ob_list?=?[]; ? ? ????????//實例化需要運行的控制器 ????????foreach?($controller_list?as?$c_key?=&gt;?$controller_name)?{ ????????????$class_name?=?'app'.$this-&gt;model_name.'controller'.$controller_name; ????????????$programs_ob_list[]?=?new?$class_name(); ????????} ? ? ? ????????//將控制器的相關回調(diào)參數(shù)傳到workerman中 ????????foreach?(['onWorkerStart',?'onConnect',?'onMessage',?'onClose',?'onError',?'onBufferFull',?'onBufferDrain',?'onWorkerStop',?'onWorkerReload']?as?$event)?{ ????????????foreach?($programs_ob_list?as?$p_key?=&gt;?$program_ob)?{ ????????????????if?(method_exists($program_ob,?$event))?{ ????????????????????$programs_ob_list[$p_key]-&gt;$event?=?[$program_ob,$event]; ????????????????} ????????????} ????????} ? ????????Start::runAll(); ????} }

例如我們創(chuàng)建一個定時器的命令appservercontroller創(chuàng)建WebhookTimer.php

<?php namespace appservercontroller; use WorkermanWorker;  use WorkermanLibTimer; use thinkacadeCache; use thinkacadeDb; use thinkRequest;   class WebhookTimer extends Start {     public $host     = &#39;0.0.0.0&#39;;     public $port     = &#39;9527&#39;;     public $name     = &#39;webhook&#39;;     public $count    = 1;     public function onWorkerStart($worker)     {                             Timer::add(2, array($this, &#39;webhooks&#39;), array(), true);                    }     public function onConnect()     {       }       public function onMessage($ws_connection, $message)     {             }       public function onClose()     {       }          public function webhooks()     {          echo 11;     }           }

執(zhí)行start命令行

php?think?spider?start

淺析thinkphp6中怎么使用workerman【教程分享】

執(zhí)行stop命令

php think spider stop

執(zhí)行全部進程命令

php think spider start all d

在appcommandSpider.php文件

public $controller_names = [‘WebhookTimer’,’其他方法’,’其他方法’];

其他方法?就是appservercontroller下創(chuàng)建的其他類文件方法

完結(jié)

Start.php文件

<?php namespace appservercontroller;   use WorkermanWorker;   class Start extends Worker {     public static $argvs = [];     public static $workerHost;     public $socket   = &#39;&#39;;     public $protocol = &#39;http&#39;;     public $host     = &#39;0.0.0.0&#39;;     public $port     = &#39;2346&#39;;     public $context  = [];       public function __construct()     {         self::$workerHost = parent::__construct($this->socket??:?$this-&gt;protocol?.?'://'?.?$this-&gt;host?.?':'?.?$this-&gt;port,?$this-&gt;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] Commands:? start		Start?worker?in?DEBUG?mode. 		Use?mode?-d?to?start?in?DAEMON?mode. stop		Stop?worker. 		Use?mode?-g?to?stop?gracefully. restart		Restart?workers. 		Use?mode?-d?to?start?in?DAEMON?mode. 		Use?mode?-g?to?stop?gracefully. reload		Reload?codes. 		Use?mode?-g?to?reload?gracefully. status		Get?worker?status. 		Use?mode?-d?to?show?live?status. connections	Get?worker?connections. "; ????????if?(!isset(static::$argvs[1])?||?!in_array(static::$argvs[1],?$available_commands))?{ ????????????if?(isset(static::$argvs[1]))?{ ????????????????static::safeEcho('Unknown?command:?'?.?static::$argvs[1]?.?" "); ????????????} ????????????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?&amp;&amp;?posix_kill($master_pid,?0)?&amp;&amp;?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'?&amp;&amp;?$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("(B",?true); ????????????????????} ????????????????????//?Echo?status?data. ????????????????????static::safeEcho(static::formatStatusData()); ????????????????????if?($command2?!==?'-d')?{ ????????????????????????exit(0); ????????????????????} ????????????????????static::safeEcho(" Press?Ctrl+C?to?quit.  "); ????????????????} ????????????????exit(0); ????????????case?'connections': ????????????????if?(is_file(static::$_statisticsFile)?&amp;&amp;?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?&amp;&amp;?posix_kill($master_pid,?$sig); ????????????????//?Timeout. ????????????????$timeout????=?5; ????????????????$start_time?=?time(); ????????????????//?Check?master?process?is?still?alive? ????????????????while?(1)?{ ????????????????????$master_is_alive?=?$master_pid?&amp;&amp;?posix_kill($master_pid,?0); ????????????????????if?($master_is_alive)?{ ????????????????????????//?Timeout? ????????????????????????if?(!static::$_gracefulStop?&amp;&amp;?time()?-?$start_time?&gt;=?$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?.?" "); ????????????????} ????????????????exit($usage); ????????} ????} ? }</command>

更多編程相關知識,請訪問:workerman教程!!

以上就是淺析

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊7 分享