zoukankan      html  css  js  c++  java
  • yii框架通过控制台命令创建定时任务

    假设Yii项目路径为 /home/apps

    1. 创建文件 /home/apps/web/protected/commands/console.php

    $yii = '/home/apps/framework/yii.php';
    require_once($yii);
    $configFile = dirname(__FILE__).'/../config/console.php';
    Yii::createConsoleApplication($configFile)->run();

    2. 修改配置文件 /home/apps/web/protected/config/console.php,配置需要的组件、数据库连接,日志等信息,格式类似主配置文件main.php

    // This is the configuration for yiic console application.
    // Any writable CConsoleApplication properties can be configured here.
    return array(
        'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
        'name'=>'My Console Application',
        'import'=>array( 
            'application.models.*',
            'application.components.*',
            'application.extensions.*',
        ),
        // preloading 'log' component
        'preload'=>array('log'),
    
        // application components
        'components'=>array(
    
            // database settings are configured in database.php
            //'db'=>require(dirname(__FILE__).'/database.php'),
            'db'=>array(
                //'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
                // uncomment the following lines to use a MySQL database
                'connectionString' => 'mysql:host=localhost;dbname=testdrive',
                'emulatePrepare' => true,
                'username' => 'root',
                'password' => '',
                'charset' => 'utf8',
            ),
            'log'=>array(
                'class'=>'CLogRouter',
                'routes'=>array(
                    array(
                        'class'=>'CFileLogRoute',
                        'levels'=>'error, warning',
                    ),
                ),
            ),
    
        ),
    );

    3. 在 /home/apps/web/protected/commands/ 下新建 TestCommand 类,继承 CConsoleCommand,在TestCommand中,可以使用项目的配置信息和Yii的各种方法

    class TestCommand extends CConsoleCommand {
        
        public function getHelp() {
            return 'test command help';
        }
        
        public function run($args) {
            echo 'hello '. $arg[0];
        }
    
    }

    执行命令

    php console.php Test

    在这个类中我们需要完成2个方法,一个是getHelp(),他用于提供Test这个类命令的帮助信息,我们可以在shell中通过命令来查看这个类的帮助

    php console.php help Test

    此外这个类的主要功能是通过继承 run($args) 这个方法来实现的,其中$args 为从命令行获得参数数组。
    现在如果我们在屏幕上输入:php console.php Test li
    我们将看到程序返回: hello li

    继承CConsoleCommand写入自己的命令类,Yii提供了两种方式去执行

    1. 如果你执行单一的任务,直接在run方法里面写

    class CHelpCommand extends CConsoleCommand
    {
        /**
         * Execute the action.
         * @param array $args command line parameters specific for this command
         */
        public function run($args)
        {
            $runner=$this->getCommandRunner();
            $commands=$runner->commands;
            if(isset($args[0]))
                $name=strtolower($args[0]);
            if(!isset($args[0]) || !isset($commands[$name]))
            {
                if(!emptyempty($commands))
                {
                    echo "Yii command runner (based on Yii v".Yii::getVersion().")
    ";
                    echo "Usage: ".$runner->getScriptName()." <command-name> [parameters...]
    ";
                    echo "
    The following commands are available:
    ";
                    $commandNames=array_keys($commands);
                    sort($commandNames);
                    echo ' - '.implode("
     - ",$commandNames);
                    echo "
    
    To see individual command help, use the following:
    ";
                    echo "   ".$runner->getScriptName()." help <command-name>
    ";
                }
                else
                {
                    echo "No available commands.
    ";
                    echo "Please define them under the following directory:
    ";
                    echo "	".Yii::app()->getCommandPath()."
    ";
                }
            }
            else
                echo $runner->createCommand($name)->getHelp();
        }
        /**
         * Provides the command description.
         * @return string the command description.
         */
        public function getHelp()
        {
            return parent::getHelp().' [command-name]';
        }
    }

    2. 另外一种就是同写你的Controller(控制器),前面增加actionXXX,例如:

    class CleanupCommand extends CConsoleCommand {
         private $sessionTableName = 'it_common_session';
         /**
          * Index Action
          */
         public function actionIndex() {
            echo "默认动作";
         }
         /**
          * 自动执行清理Session,每2分钟.
          */
         public function actionSession() {
            $now = time();
            $sql="DELETE FROM {$this->sessionTableName} WHERE lastactivity < $now";
            $command = Yii::app()->dz->createCommand($sql);
            $command->execute();
         }
         /**
          * 清理系统缓存,每天早上7:30
          */
         public function actionCache() {
            Yii::app()->cache -> flush();
            Yii::app()->dbcache -> flush();
            Yii::app()->fcache -> flush();
         }
         /**
          * 清除上传临时文件
          */
         public function actionTempfiles() {
            $dir = Yii::getPathOfAlias('site.frontend.www.uploads.temp').'/';
            foreach(glob($dir.'*.*') as $v){
                unlink($v);
            }
         }
    }    

    执行Index动作,默认Index

    php cron.php Cleanup

    执行Cache动作

    php cron.php Cleanup cache

    4. 创建定时任务

    $ crontab -e
    0 2 * * * php console.php cleanup >> /path/to/logfile &

    上面的意思是说每天晚上两点自动执行清理任务,简单几步就完成了强大的自动化功能任务.是不是够简单

  • 相关阅读:
    团队冲刺第四天
    团队冲刺第三天
    团队冲刺第二天
    团队冲刺第一天
    全球疫情地图显示
    团队博客——keep running视频+PPT介绍
    周总结7
    人月神话阅读笔记03
    Java枚举类型的使用,数值的二进制表示
    四则运算器
  • 原文地址:https://www.cnblogs.com/phpfans/p/4510579.html
Copyright © 2011-2022 走看看