如何开发计划任务插件?
跳到导航
跳到搜索
目录
功能说明
计划任务,定时执行一些自动任务。如:自动收货,自动删除日志,自动统计数据
目录位置
./content/plugins/cron_xxx
包含:语言包,配置文件,类文件,安装卸载类文件(参见cron_bill_queue)
命名规范
cron_xxx, 如:cron_bill_queue(结算队列处理)
文件说明
cron_xxx.php(主文件,安装卸载)
此文件写法固定,需要替换的有:
- 头部注释,此处关键信息不可省略,插件列表需使用
- 插件code:cron_xxx
defined('IN_ECJIA') or exit('No permission resources.');
/*
Plugin Name: 插件名称,如:商家结算队列处理
Plugin URI: http://www.ecjia.com/plugins/ecjia.cron_xxx/
Description: 插件描述,如:结算队列中的订单金额到商家账户
Author: ECJIA TEAM
Version: 1.16.0
Author URI: http://www.ecjia.com/
Plugin App: cron
*/
class plugin_cron_xxx {
public static function install() {
$config = include(RC_Plugin::plugin_dir_path(__FILE__) . 'config.php');
$param = array('file' => __FILE__, 'config' => $config);
return RC_Api::api('cron', 'plugin_install', $param);
}
public static function uninstall() {
$config = include(RC_Plugin::plugin_dir_path(__FILE__) . 'config.php');
$param = array('file' => __FILE__, 'config' => $config);
return RC_Api::api('cron', 'plugin_uninstall', $param);
}
}
Ecjia_PluginManager::extend('cron_xxx', function() {
require_once RC_Plugin::plugin_dir_path(__FILE__) . 'cron_xxx.class.php';
return new cron_xxx();
});
RC_Plugin::register_activation_hook(__FILE__, array('plugin_cron_xxx', 'install'));
RC_Plugin::register_deactivation_hook(__FILE__, array('plugin_cron_xxx', 'uninstall'));
config.php(配置文件)
return array(
'cron_code' => 'cron_xxx',//如:cron_bill_queue
);
languages/zh_CN/plugin.lang.php(语言包)
return array(
//简单使用可忽略,后面高级用法会讲到
);
参考界面理解配置项和语言包
cron_xxx.class.php(类文件)
包含4个方法
- run() 执行方法,此方法处理任务逻辑,建议具体逻辑写在app下的类内调用,开发时只需修改此方法
- getCode() //默认方法不用改
- loadConfig() //默认方法不用改
- loadLanguage() //默认方法不用改
代码示例
use Ecjia\App\Cron\CronAbstract;
/**
* 自动处理插件
*/
class cron_bill_queue extends CronAbstract
{
/**
* 计划任务执行方法
*/
public function run() {
//插件处理逻辑,注意控制单次处理条数,防止数据量大
RC_Model::model('commission/store_bill_queue_model')->bill_queue();
}
/**
* 获取插件代号
*
* @see \Ecjia\System\Plugin\PluginInterface::getCode()
*/
public function getCode()
{
return $this->loadConfig('cron_code');
}
/**
* 加载配置文件
*
* @see \Ecjia\System\Plugin\PluginInterface::loadConfig()
*/
public function loadConfig($key = null, $default = null)
{
return $this->loadPluginData(RC_Plugin::plugin_dir_path(__FILE__) . 'config.php', $key, $default);
}
/**
* 加载语言包
*
* @see \Ecjia\System\Plugin\PluginInterface::loadLanguage()
*/
public function loadLanguage($key = null, $default = null)
{
$locale = RC_Config::get('system.locale');
return $this->loadPluginData(RC_Plugin::plugin_dir_path(__FILE__) . '/languages/'.$locale.'/plugin.lang.php', $key, $default);
}
}
高级用法
用法一:自定义计划任务执行时间
需修改配置文件实现
config.php
return array(
//...
//默认计划任务执行时间
//expression_alias时间别名(对应下拉框选择时间的value值),cron_expression时间表达式
'default_time' => array( 'expression_alias' => 'everyTenMinutes', 'cron_expression' => '*/10 * * * * *'),//推荐写法,表示每十分钟执行一次
'default_time' => array('day' => '0', 'week' => '', 'hour' => '4', 'minute' => ''),//废弃写法
//...
);
expression_alias时间类型:
- cron 自定义
- manual 手动输入表达式
- everyMinute 每分钟执行一次任务
- everyFiveMinutes 每五分钟执行一次任务
- everyTenMinutes 每十分钟执行一次任务
- everyThirtyMinutes 每半小时执行一次任务
- hourly 每小时执行一次任务
- daily 每到午夜执行一次任务
- weekly 每周执行一次任务
- monthly 每月执行一次任务
- quarterly 每季度执行一次任务
- yearly 每年执行一次任务
参考下图理解配置项
用法二:自定义计划任务执行时间+锁定此时间
需修改配置文件实现
config.php
return array(
//...
//默认计划任务执行时间
'default_time' => array( 'expression_alias' => 'everyTenMinutes', 'cron_expression' => '*/10 * * * * *'),//推荐写法,表示每十分钟执行一次
//锁定任务时间,使之不可修改(根据需要修改),必须有default_time才可锁定时间
'lock_time' => true,
//...
);
锁定效果如下图:
用法三:使用form表单
使用情景:计划任务执行时需要一定条件和参数的时候,如:
- 自动确认收货,确认收货的天数(5?10?15?)
- 自动关闭未付款订单,多久未付款的?(30分钟?60分钟?1天?)
需修改配置文件+语言包文件实现
1.config.php
return array(
//...
//自定义配置表单内容
'forms' => array(
//forms有三种type类型:text文本框,select下拉框,textarea文本域
//类型1.select,表单name=bill_day_count,表单类型为下拉框,值为5(其他值通过语言包获得)
array('name' => 'bill_day_count',//对应语言包 'type' => 'select', 'value' => '5'),
//类型2.text,表单name=bill_day_count,表单类型为文本框,值为5(可省略)
array('name' => 'bill_day_count',//对应语言包 'type' => 'text', 'value' => '5'),
//类型3.textarea,表单name=bill_day_count,表单类型为文本域,值为5(可省略)
array('name' => 'bill_day_count',//对应语言包 'type' => 'textarea', 'value' => '5'),
),
//...
);
2.languages/zh_CN/plugin.lang.php
return array(
//配置名称
'bill_day_count' => '每次生成数量:', //对应下图位置1
//select类型下拉框对应的option,value和显示名称
'bill_day_count_range' => array( //option值,对应下图位置2
'5' => '5条',//<option value="5">5条</option>
'10' => '10条',
'20' => '20条',
'50' => '50条',
),
//form表单对应的描述说明,对应下图位置3
'bill_day_count_desc' => '选择账单单次生成数量防止数据过多失败',
);
form用法图示
用法四:常用form表单举例
//删除浏览日志
//config
return array(
'forms' => array(
array('name' => 'ipdel_day', 'type' => 'select', 'value' => '30'),
),
);
//language
return array(
'ipdel_day' => '删除几天前浏览日志:',
'ipdel_day_range' => array(
'7' => '7天',
'15' => '15天',
'30' => '30天',
'90' => '90天',
'180' => '180天',
'240' => '240天',
'360' => '360天'
)
);
//确认收货
//config
return array(
'forms' => array(
array('name' => 'auto_manage_count', 'type' => 'select', 'value' => '5'),
),
);
//language
return array(
'order_receive' => '计划任务-订单自动确认收货',
'order_receive_desc' => '订单自动确认收货,设置发货后多少天自动确认收货',
'order_receive_day' => '自动收货时间间隔:',
'order_receive_day_range' => array(
'7' => '7天',
'15' => '15天',
'30' => '30天',
)
);
//关闭未付款订单
//config
return array(
'forms' => array(
array('name' => 'unpayed_hours', 'type' => 'select', 'value' => '24'),
array('name' => 'unpayed_count', 'type' => 'select', 'value' => '100'),
),
);
//language
return array(
'unpayed_hours' => '关闭多久未付款的订单:',
'unpayed_count' => '每次关闭的个数:',
'unpayed_hours_range' => array(
'1' => '1小时',
'3' => '3小时',
'6' => '6小时',
'12' => '12小时',
'24' => '1天',
'48' => '2天',
'72' => '3天',
),
'unpayed_count_range' => array(
'10' => '10',
'20' => '20',
'50' => '50',
'100' => '100',
'200' => '200',
),
);
相关数据表:crons