设为首页收藏本站
查看: 88|回复: 0

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

[复制链接]

论坛元老

Rank: 6Rank: 6

积分
34274
主题
17031
UID
1347
M币
67
贡献
17176

  • 发表于 2014-5-16 09:11:00 | 显示全部楼层 |阅读模式
    这篇文章将介绍如何在Linux下使用Cron jobs自动化执行Yii Console Application(控制台)任务,像每天晚上执行缓存清理,临时文件清理,发送邮件,网站备份等等,重复的工作都交给服务器后台去完成,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 "\n\nTo 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 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?授权
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    在我站开通SVIP可同时获得17个站点VIP资源 立即登录 立即注册
    快速回复 返回顶部 返回列表