• TP6:Worerman定时任务的后台守护执行


    使用Timer创建定时的任务,可以以后台守护进程的方式执行。

    Worker::runAll()执行时,会执行其中的parseCommand()方法。

    protected static function parseCommand()
    {
        // 守护进程执行方式,只会在LINUX系统下才可以
        if (static::$_OS !== \OS_TYPE_LINUX) {
            return;
        }
        
        // 命令和参数是通过$argv传递给Workerman的。
        
        global $argv;
        
        // Check argv;
        $start_file = $argv[0];
        $available_commands = array(
            'start',
            'stop',
            'restart',
            'reload',
            'status',
            'connections',
        );
        
        //
        // 通常的执行命令格式:
        //     php timer.php start
        //       php timer.php start -d
        // 对应的$argv[0]=timer.php,$argv[1]=start
        //
        
        $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($argv[1]) || !\in_array($argv[1], $available_commands)) {
            if (isset($argv[1])) {
                static::safeEcho('Unknown command: ' . $argv[1] . "\n");
            }
            exit($usage);
        }
    
        // Get command.
        $command  = \trim($argv[1]);
        $command2 = isset($argv[2]) ? $argv[2] : '';
    
        // Start command.
        $mode = '';
        if ($command === 'start') {
            if ($command2 === '-d' || static::$daemonize) {
                $mode = 'in DAEMON mode';
            } else {
                $mode = 'in DEBUG mode';
            }
        }
        
        ... ...
    }
    

    所以,Workerman建议的使用方法是,创建单独的执行文件。

    <?php
    require_once 'vendor/workerman/workerman/Autoloader.php';
    
    use Workerman\Worker;
    use Workerman\Lib\Timer;
    
    $worker = new Worker();
    
    $worker->onWorkerStart = function()
    {
        // 每隔3秒钟执行一次
        Timer::add(3, function() {
            echo 'Hello ' . date('Y-m-d H:i:s') . PHP_EOL;
        });
    };
    
    Worker::runAll();
    

    如何与Thinkphp的命令模式集成在一起使用的?那就需要在Command文件中按照Workman的要求,重置$argv参数数组。
    参考手把手教你在tp6中实现毫秒级定时任务功能

    protected function initialize(Input $input, Output $output)
    {
    	global $argv;
    	
    	if ($input->hasOption('i'))
    		$this->interval = floatval($input->getOption('i'));
    		
    	$argv[1] = $input->getArgument('status') ?: 'start';
    	
    	if ($input->hasOption('d')) {
    		$argv[2] = '-d';
    	} else {
    		unset($argv[2]);
    	}
    }
    
  • 相关阅读:
    QML的一些基础的区分
    qml的一个文章----可以看出状态、动画的使用
    凡是人性的,都是如下的
    全国经纬度,具体到县
    web-nodkit 入门
    一个文章-转年收入50万美元的软件工程师做的是什么类型的工作
    qml 封装技巧-利用数据来进行适配
    windbg内核诊断方式--转载
    Windbg程序调试--转载
    编写你自己的单点登录(SSO)服务
  • 原文地址:https://www.cnblogs.com/eastson/p/16253229.html
Copyright © 2020-2023  润新知