qi_ruo 发表于 2011-11-21 20:19:36

计划任务 Cron Schedule 0.1

本帖最后由 qi_ruo 于 2011-11-21 20:32 编辑

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

安装:
1 数据库添加表: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添加:/*
|--------------------------------------------------------------------------
| 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

$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

class MyClass
{
    function clear_log($params = array())
    {
      // 清理LOG
    }
   
    //.....
}

6 添加 /application/controllers/cron.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 下载



自然 发表于 2012-4-6 14:39:59

{:soso_e102:}{:soso_e102:}

youngqj 发表于 2012-4-6 19:22:15

真的能用么?

^淡如清风 发表于 2012-9-24 17:39:11

很给力,如果能说说原理就更好啦

4664919 发表于 2012-10-18 14:44:29

研究研究   :lol:lol

apibrain 发表于 2013-5-28 00:45:37

正好用上

lizhe 发表于 2013-5-28 11:25:44

给力,研究下

13579443 发表于 2013-7-27 00:51:14

可以用 非常不错但是不支持并行处理

frankth 发表于 2013-8-26 17:33:12

嗯,lz讲的不错。不过有两点疑问:
1. 怎么来使用php动态调用crontab。
即使能够更新liunx crontab的文件,但那需要root赋予该权限。
参考:
http://bbs.phpchina.com/thread-204093-1-1.html
2.不知道,对并行处理是否有效果。

gubin15 发表于 2014-4-22 16:11:41

mark一下!!!!!!!
页: [1] 2
查看完整版本: 计划任务 Cron Schedule 0.1