首页 > PHP资讯 > PHP培训技术 > Linux下使用Cronjobs自动化执行Yii控制台任务

Linux下使用Cronjobs自动化执行Yii控制台任务

PHP培训技术

这篇文章将介绍如何在 )任务,像每天晚上执行缓存清理,临时文件清理,发送邮件,网站备份等等,重复的工作都交给服务器后台去完成,Yii本身已经提供了强大的支持,我们所做的工作就很少,当使用yiic webapp 自动生成工程结构时,强大的Yii已经全部帮我们生成好,仅仅只需三步。

1.配置好product/config/console.php里面需要用到的组件,像数据库连接

'db'=>array(    'connectionString' => 'mysql:host=localhost;dbname=testdrive',    'emulatePrepare' => true,    'username' => 'root',    'password' => '',),

2.继承CConsoleCommand写入自己的命令类。

Yii提供了两种方式去执行,如果你执行单一的任务,直接在run方法里面写,另外一种就和Controller(控制器)中的Action(动作)类似,前面增加actionXXX,在framework/console下提供了很多实例供我们参考使用。例如CHelpCommand直接使用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().")n";                echo "Usage: ".$runner->getScriptName()."  [parameters...]n";                echo "nThe following commands are available:n";                $commandNames=array_keys($commands);                sort($commandNames);                echo ' - '.implode("n - ",$commandNames);                echo "nnTo see individual command help, use the following:n";                echo "   ".$runner->getScriptName()." help n";             }else{                echo "No available commands.n";                echo "Please define them under the following directory:n";                echo "t".Yii::app()->getCommandPath()."n";             }         }else            echo $runner->createCommand($name)->getHelp();    }    /**     * Provides the command description.     * @return string the command description.     */    public function getHelp()    {        return parent::getHelp().' [command-name]';    }}

接下来使用使用Action执行清理命令

class CleanupCommand extends CConsoleCommand {    private $sessionTableName = 'it_common_session';    /**     * 自动执行清理Session,每2分钟.     */    public function actionSession() {        $now = time();        $sql="DELETE FROM {$this->sessionTableName} WHERE lastactivity < $now";        $command = Yii::app()->db->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);        }    }}

3.使用Linux命令,?vi crontab -e?打开自动执行tab, 增加一行

30 2 * * * php /path/to/console.php cleanup xxx >> /path/to/logfile

需要在Yii应用目录下创建和入口文件同级的console.php:

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

常见问题:

1).如果crontab 没有自动执行,仔细检测你的语法是否正确。

2).确定protected/yiic?文件是否有执行权限, 如果没有使用命令?chmod +x yiic?授权

PHP培训技术

本文由欣才IT学院整理发布,未经许可,禁止转载。
支持42不支持0