Newer
Older
Thomas Steur
a validé
<?php
/**
* Piwik - free/libre analytics platform
Thomas Steur
a validé
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik\Plugin;
use Piwik\Scheduler\Schedule\Schedule;
Thomas Steur
a validé
/**
* Base class for all Tasks declarations.
* Tasks are usually meant as scheduled tasks that are executed regularily by Piwik in the background. For instance
* once every hour or every day. This could be for instance checking for updates, sending email reports, etc.
* Please don't mix up tasks with console commands which can be executed on the CLI.
*/
Thomas Steur
a validé
class Tasks
{
/**
Thomas Steur
a validé
*/
private $tasks = array();
const LOWEST_PRIORITY = Task::LOWEST_PRIORITY;
const LOW_PRIORITY = Task::LOW_PRIORITY;
const NORMAL_PRIORITY = Task::NORMAL_PRIORITY;
const HIGH_PRIORITY = Task::HIGH_PRIORITY;
const HIGHEST_PRIORITY = Task::HIGHEST_PRIORITY;
Thomas Steur
a validé
/**
* This method is called to collect all schedule tasks. Register all your tasks here that should be executed
* regularily such as daily or monthly.
*/
Thomas Steur
a validé
public function schedule()
{
// eg $this->daily('myMethodName')
Thomas Steur
a validé
}
/**
Thomas Steur
a validé
*/
public function getScheduledTasks()
{
return $this->tasks;
}
/**
* Schedule the given tasks/method to run once every hour.
*
* @param string $methodName The name of the method that will be called when the task is being
* exectuted. To make it work you need to create a public method having the
* given method name in your Tasks class.
* @param null|string $methodParameter Can be null if the task does not need any parameter or a string. It is not
* possible to specify multiple parameters as an array etc. If you need to
* pass multiple parameters separate them via any characters such as '###'.
* For instance '$param1###$param2###$param3'
* @param int $priority Can be any constant such as self::LOW_PRIORITY
*
Thomas Steur
a validé
* @api
*/
protected function hourly($methodName, $methodParameter = null, $priority = self::NORMAL_PRIORITY)
{
return $this->custom($this, $methodName, $methodParameter, 'hourly', $priority);
Thomas Steur
a validé
}
/**
* Schedule the given tasks/method to run once every day.
*
* See {@link hourly()}
* @api
*/
protected function daily($methodName, $methodParameter = null, $priority = self::NORMAL_PRIORITY)
{
return $this->custom($this, $methodName, $methodParameter, 'daily', $priority);
Thomas Steur
a validé
}
/**
* Schedule the given tasks/method to run once every week.
*
* See {@link hourly()}
* @api
*/
protected function weekly($methodName, $methodParameter = null, $priority = self::NORMAL_PRIORITY)
{
return $this->custom($this, $methodName, $methodParameter, 'weekly', $priority);
Thomas Steur
a validé
}
/**
* Schedule the given tasks/method to run once every month.
*
* See {@link hourly()}
* @api
*/
protected function monthly($methodName, $methodParameter = null, $priority = self::NORMAL_PRIORITY)
{
return $this->custom($this, $methodName, $methodParameter, 'monthly', $priority);
Thomas Steur
a validé
}
/**
* Schedules the given tasks/method to run depending at the given scheduled time. Unlike the convenient methods
* such as {@link hourly()} you need to specify the object on which the given method should be called. This can be
* either an instance of a class or a class name. For more information about these parameters see {@link hourly()}
*
* @param string|object $objectOrClassName
* @param string $methodName
* @param null|string $methodParameter
* @param string|Schedule $time
Thomas Steur
a validé
* @param int $priority
*
* @return \Piwik\Scheduler\Schedule\Schedule
Thomas Steur
a validé
*
* @throws \Exception If a wrong time format is given. Needs to be either a string such as 'daily', 'weekly', ...
* or an instance of {@link Piwik\Scheduler\Schedule\Schedule}
Thomas Steur
a validé
*
* @api
*/
protected function custom($objectOrClassName, $methodName, $methodParameter, $time, $priority = self::NORMAL_PRIORITY)
{
$this->checkIsValidTask($objectOrClassName, $methodName);
Thomas Steur
a validé
if (is_string($time)) {
$time = Schedule::factory($time);
Thomas Steur
a validé
}
if (!($time instanceof Schedule)) {
throw new \Exception('$time should be an instance of Schedule');
Thomas Steur
a validé
}
$this->scheduleTask(new Task($objectOrClassName, $methodName, $methodParameter, $time, $priority));
Thomas Steur
a validé
return $time;
}
/**
* In case you need very high flexibility and none of the other convenient methods such as {@link hourly()} or
* {@link custom()} suit you, you can use this method to add a custom scheduled task.
*
*/
protected function scheduleTask(Task $task)
Thomas Steur
a validé
{
$this->tasks[] = $task;
}
private function checkIsValidTask($objectOrClassName, $methodName)
{
Development::checkMethodIsCallable($objectOrClassName, $methodName, 'The registered task is not valid as the method');
}