计划任务让你有规律地执行任务(每小时,每周,…),例如:
方法将计划任务添加到插件中控制台:
$ ./console generate:定时任务
该命令将要求您输入插件的名称并创建一个插件/编写MyPlugin / Tasks.php
文件。这个文件包含了一些例子来帮助你入门:
类任务扩展\Piwik\Plugin\Tasks{公共函数调度(){$this->hour ('myTask');// myTask()每小时执行一次$this->daily('myTask');$this->weekly('myTask');// myTask()将每周执行一次$this->monthly('myTask');// myTask()将每月执行一次//传递一个参数给任务$this->每周('myTaskWithParam', 'anystring');//指定不同的优先级$this->monthly('myTask', null, self::LOWEST_PRIORITY);$this->monthly('myTaskWithParam', 'anystring', self::HIGH_PRIORITY);public function myTaskWithParam($param) {// do something}}
正如你在生成的模板中看到的,通过注册一个代表实际任务的方法,你可以每小时、每天、每周和每月执行任务:
公共函数schedule(){//注册方法remindMeToLogIn每天执行一次$this->daily('remindMeToLogIn');}公共函数remindMeToLogIn() {$mail = new \Piwik\ mail ();邮件- >遭受美元(“me@example.com”);邮件- > setSubject(检查数据);$mail->setBodyText('登录到您的Matomo(以前的Piwik)实例并检查您的统计数据!');邮件- >发送();}
这个例子每天向您发送一封电子邮件,提醒您每天登录您的Matomo。Matomo平台确保每天准确地执行一次remindMeToLogIn方法。
有时您希望将参数传递给任务方法。如果你想为每个用户或每个网站注册一个任务,这是很有用的。可以通过在注册要执行的方法时指定第二个参数来实现这一点。
public function schedule() {foreach (\Piwik\Site::getSites() as $ Site){//为每个站点创建一个任务,并将每个站点的URL传递给任务$this->hour ('pingSite', $ Site ['main_url']);}}公共函数pingSite($siteMainUrl) {file_get_contents($siteMainUrl);}
默认情况下,由于异常而失败的计划任务将不会再次运行,直到下一次正常执行时间。如果您的任务以适合重试的方式失败,则可以抛出Piwik \ SchedulerRetryableException
.任务调度器将重新调度失败的任何任务RetryableException
在一小时内再次尝试该任务,最多重试三次。
公共函数myTask() {try {// do something} catch (Exception $e) {if ($e->getMessage() == "某些API:请求太多,请稍后重试"){抛出新的RetryableException($e->getMessage())}其他{抛出$e;}}}
使用实例手动执行所有定时任务。
$ ./console核心:run-scheduled-tasks
但这有一个问题:Matomo确保计划任务每小时或每天只执行一次。这意味着您不能简单地一次又一次地运行命令,因为您必须等待下一个小时或下一天。
为了解决这个问题,——力
选项将强制执行所有任务,即使是那些此时不应运行的任务。
$ ./console core:run-scheduled-tasks——force
请记住,手动测试计划任务只是第一步:添加单元或集成测试是避免倒退的最好方法。
的TasksTimetable插件可以为你回答这个问题。只需安装和激活插件与点击>市场>获得新功能.它将在下面添加一个新的管理菜单项设置命名计划任务.
有关计划任务的更多信息,请参阅任务类引用.