用户
 找回密码
 入住 CI 中国社区
搜索
查看: 11884|回复: 10
收起左侧

[库 Library] 计划任务 Cron Schedule 0.1

    [复制链接]
发表于 2011-11-21 20:19:36 | 显示全部楼层 |阅读模式
本帖最后由 qi_ruo 于 2011-11-21 20:32 编辑

用途:
网站可能需要执行多个计划任务,比如每小时清理一次缓存,每天生成一次sitemap,每周备份一次数据库...如果都写在crontab里,可能不便于管理和用户配置,使用这个类可以方便的添加计划任务,查看执行计划任务的log,也可以在后台管理每个计划任务的执行时间。

安装:
1 数据库添加表:
SQL复制代码
CREATE TABLE `cron_schedule` (
  `schedule_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `job_code` VARCHAR(255) NOT NULL DEFAULT '0',
  `status` enum('pending','running','success','missed','error') NOT NULL DEFAULT 'pending',
  `messages` text,
  `created_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `scheduled_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `executed_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `finished_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY  (`schedule_id`),
  KEY `task_name` (`job_code`),
  KEY `scheduled_at` (`scheduled_at`,`status`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
复制代码


2 /application/config/config.php添加:
PHP复制代码
/*
|--------------------------------------------------------------------------
| Cron Schedule Variables
|--------------------------------------------------------------------------
|
| 'enable_cron'                     = 是否开启cron schedule
| 'cron_schedule_table_name'        = 保存cron schedule的表
| 'cron_schedule_generate_every'    = 生成cron schedule的时间间隔
| 'cron_schedule_ahead_for'         = 每次产生多少时间内的cron schedule
| 'cron_schedule_lifetime'          = cron schedule的有效期
| 'cron_history_cleanup_every'      = 清除cron schedule的时间间隔
| 'cron_history_success_lifetime'   = 运行成功的cron schedule的保存时间
| 'cron_history_failure_lifetime'   = 运行失败的cron schedule的保存时间
|
*/

$config['enable_cron'] = TRUE;
$config['cron_schedule_table_name'] = 'cron_schedule';
$config['cron_schedule_generate_every'] = 15;
$config['cron_schedule_ahead_for'] = 20;
$config['cron_schedule_lifetime'] = 15;
$config['cron_history_cleanup_every'] = 10;
$config['cron_history_success_lifetime'] = 60;
$config['cron_history_failure_lifetime'] = 600;
 
复制代码

3 /application/libraries/Cron_schedule.php 参见附件

4 新建 /application/config/cron_schedules.php  在此文件中添加计划任务,比如:
PHP复制代码
<?php
 
$cron_schedule['clear_log'] = array(
    'schedule'  => array(
        'config_path' => '',            // cron表达式的标识 用于在配置文件或数据库中获取表达式 直接指定时为空
        'cron_expr'   => '*/5 * * * *'  // 直接指定cron表达式 在配置文件或数据库中获取表达式为空
    ),
    'run'       => array(
        'filepath'  => 'cron',          // 文件所在的目录 相对于APPPATH
        'filename'  => 'Myclass.php',   // 文件名
        'class'     => 'MyClass',       // 类名 如果只是简单函数 可为空
        'function'  => 'clear_log',     // 要执行的函数
        'params'    => array()          // 需要传递的参数
    )
);
 
//$cron_schedule['clear_log'] = ...
//$cron_schedule['create_sitemap'] = ...
//$cron_schedule['backup_database'] = ...
 
复制代码

5 添加对应的类和函数 /application/cron/Myclass.php
PHP复制代码
<?php
 
class MyClass
{
    function clear_log($params = array())
    {
        // 清理LOG
    }
   
    //.....
}
 
复制代码

6 添加 /application/controllers/cron.php
PHP复制代码
<?php
 
class Cron extends CI_Controller
{
    public function index()
    {
        $this->load->library('cron_schedule');
        $this->cron_schedule->dispatch();
    }
}
 
复制代码

7 添加系统cron
#crontab -e
    根据需要添加计划任务,比如:
    */5 * * * * php /var/www/ci210/index.php cron index
#service cron restart

8 License
此类由开源程序 Magento 移植,Magento基于OSL 3.0

9 下载
Cron_schedule.php.zip (3.24 KB, 下载次数: 446)


评分

参与人数 3威望 +17 收起 理由
666 + 10 赞一个!
自然 + 2 很给力!
Hex + 5 很给力!

查看全部评分

发表于 2012-4-6 14:39:59 | 显示全部楼层
{:soso_e102:}{:soso_e102:}
发表于 2012-4-6 19:22:15 | 显示全部楼层
真的能用么?
发表于 2012-9-24 17:39:11 | 显示全部楼层
很给力,如果能说说原理就更好啦
发表于 2012-10-18 14:44:29 | 显示全部楼层
研究研究   
发表于 2013-5-28 00:45:37 | 显示全部楼层
正好用上
发表于 2013-5-28 11:25:44 | 显示全部楼层
给力,研究下
发表于 2013-7-27 00:51:14 | 显示全部楼层
可以用 非常不错  但是不支持并行处理
发表于 2013-8-26 17:33:12 | 显示全部楼层
嗯,lz讲的不错。不过有两点疑问:
1. 怎么来使用php动态调用crontab。
即使能够更新liunx crontab的文件,但那需要root赋予该权限。
参考:
http://bbs.phpchina.com/thread-204093-1-1.html
2.不知道,对并行处理是否有效果。

本版积分规则