Magento中的计划任务很容易配置。config.xml中的几行代码加一个方法就完成了。但如果你想更有意思点,创建一个日程计划任务呢?幸运的是,Magento系统中已经有了这个功能,实现起来也很简单。 计划任务本身比较直接。正如下面代码所见,它在config.xml中由两部分被定义:日程和一个被执行的方法。下面的例子展示了一个名为"my_cron"的计划任务,每5分钟执行观测者文件中的"doSomething"方法。如果你不熟悉计划任务的格式,网上有一堆关于计划任务的文章。 <config> <crontab> <jobs> <my_cron> <schedule> <cron_expr>*/5 * * * *</cron_expr> </schedule> <run> <model>mymodule/observer::doSomething</model> </run> </my_cron> </jobs> </crontab> </config> 计划任务不能被配置。在计划任务被生成的Mage_Cron_Model_Observer类里,有一个生成方法,以同样的方式检查core_config_data表中的值和configxml文件。知道了这一点,我们就可以保存路径和设置我们想要的值。让我们开始吧。 Admin configuration(管理员配置)因为我们想要日程配置计划任务,所以我们需要有一个对应的管理员配置。你可以随你喜欢地完成它,但是我将使用Magento中提供给我们的。 在system.xml中会有Magento中封装好的时间(小时,分钟和秒)和频率选择器(每日,每周和每月)。代码所要完成的是创建我们的后台块来格式化和保存我们想要的路径值。在这里,它将在mymodule/adminhtml_system_config_backend_mymodel_cron。 <config> <sections> <catalog> <groups> <configurable_cron translate="label"> <label>Cron Schedule</label> <sort_order>100</sort_order> <show_in_default>1</show_in_default> <show_in_website>0</show_in_website> <show_in_store>0</show_in_store> <fields> <time translate="label"> <label>Start Time</label> <frontend_type>time</frontend_type> <sort_order>10</sort_order> <show_in_default>1</show_in_default> <show_in_website>0</show_in_website> <show_in_store>0</show_in_store> </time> <frequency translate="label"> <label>Frequency</label> <frontend_type>select</frontend_type> <source_model>adminhtml/system_config_source_cron_frequency</source_model> <backend_model>mymodule/adminhtml_system_config_backend_mymodel_cron</backend_model> <sort_order>20</sort_order> <show_in_default>1</show_in_default> <show_in_website>0</show_in_website> <show_in_store>0</show_in_store> </frequency> </fields> </configurable_cron> </groups> </catalog> </sections> </config> Backend model(后台模块)管理员配置中的前端类型不保存计划任务选择器读取的输入类型。由于这个,我们必须后台模块来填补我们想要的输入类型。 从上面设置普通计划任务的示例代码中,同样的路径也被core_config_data表使用,我们将要处理它。由上面的代码可知,我们日程的路径是"crontab/jobs/my_cron/schedule/cron_expr"。下面的代码格式化输入并保存值到表。 class Alwayly_MyModule_Model_Adminhtml_System_Config_Backend_MyModel_Cron extends Mage_Core_Model_Config_Data { const CRON_STRING_PATH = ‘crontab/jobs/my_cron/schedule/cron_expr'; protected function _afterSave() { $time = $this->getData('groups/configurable_cron/fields/time/value'); $frequencyDaily = Mage_Adminhtml_Model_System_Config_Source_Cron_Frequency::CRON_DAILY; $frequencyWeekly = Mage_Adminhtml_Model_System_Config_Source_Cron_Frequency::CRON_WEEKLY; $frequencyMonthly = Mage_Adminhtml_Model_System_Config_Source_Cron_Frequency::CRON_MONTHLY; $cronDayOfWeek = date('N'); $cronExprArray = array( intval($time[1]), # Minute intval($time[0]), # Hour (frequency == $frequencyMonthly) ? '1' : '*', # Day of the Month '*', # Month of the Year (frequency == $frequencyWeekly) ? '1' : '*', # Day of the Week ); $cronExprString = join(' ', $cronExprArray); try { Mage::getModel('core/config_data') ->load(self::CRON_STRING_PATH, 'path') ->setValue($cronExprString) ->setPath(self::CRON_STRING_PATH) ->save(); } catch (Exception $e) { throw new Exception(Mage::helper('cron')->__('Unable to save the cron expression.')); } } } 计划任务生成器浏览计划任务,选择日程被定义的那个。从config表中读取日程,日程调度结点必须从config.xml中被移除,仅定义了模型,如下所示: <config> <crontab> <jobs> <my_cron> <run> <model>mymodule/observer::doSomething</model> </run> </my_cron> </jobs> </crontab> </config> 后台发生了什么?计划任务生成器浏览config.xml文件和config表,寻找计划任务日程并填充计划日程表。此时和模型是不相关的。没有被定义日程的计划任务被跳过。另一种方法,从计划日程表中读取计划任务,从config.xml文件和config表中收集方法并执行。 Observer(观测者)观测者中是将被计划任务执行的方法。这里的代码由你决定。 class Alwayly_MyModule_Model_Observer { public function doSomething() { // do something } } 这只是个使用日程计划任务的例子。当你理解它如何工作后,这里还有很大的提升空间。 (责任编辑:好模板) |