如何开发计划任务插件?

来自ECJiaWiki
跳转至: 导航搜索

功能说明

 计划任务,定时执行一些自动任务。如:自动收货,自动删除日志,自动统计数据

目录位置

 ./content/plugins/cron_xxx

Cron.jpg

包含:语言包,配置文件,类文件,安装卸载类文件(参见cron_bill_queue)

命名规范

 cron_xxx, 如:cron_bill_queue(结算队列处理)

文件说明

cron_xxx.php(主文件,安装卸载)

此文件写法固定,需要替换的有:

  1. 头部注释,此处关键信息不可省略,插件列表需使用
  2. 插件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 bill queue.png

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 每年执行一次任务

参考下图理解配置项

Cron time.png


用法二:自定义计划任务执行时间+锁定此时间

需修改配置文件实现

config.php

return array(
    //...
    //默认计划任务执行时间
    'default_time' => array( 'expression_alias' => 'everyTenMinutes', 'cron_expression' => '*/10 * * * * *'),//推荐写法,表示每十分钟执行一次
    //锁定任务时间,使之不可修改(根据需要修改),必须有default_time才可锁定时间
    'lock_time' => true,

    //...
);

锁定效果如下图:

Cron-lock.png

用法三:使用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用法图示

Cron-form.jpg

用法四:常用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