blob: 92aa1b340ecdcdd61bdafbf1c0c19906438c89bc (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
<?php
/**
* Piwik - free/libre analytics platform
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
*/
namespace Piwik;
/**
* This data structure holds the scheduled times for each active scheduled task.
*/
class ScheduledTaskTimetable
{
const TIMETABLE_OPTION_STRING = "TaskScheduler.timetable";
private $timetable;
public function __construct()
{
$optionData = Option::get(self::TIMETABLE_OPTION_STRING);
$unserializedTimetable = @unserialize($optionData);
$this->timetable = $unserializedTimetable === false ? array() : $unserializedTimetable;
}
public function getTimetable()
{
return $this->timetable;
}
public function setTimetable($timetable)
{
$this->timetable = $timetable;
}
public function removeInactiveTasks($activeTasks)
{
$activeTaskNames = array();
foreach ($activeTasks as $task) {
$activeTaskNames[] = $task->getName();
}
foreach (array_keys($this->timetable) as $taskName) {
if (!in_array($taskName, $activeTaskNames)) {
unset($this->timetable[$taskName]);
}
}
}
public function getScheduledTaskNames()
{
return array_keys($this->timetable);
}
public function getScheduledTaskTime($taskName)
{
return isset($this->timetable[$taskName]) ? Date::factory($this->timetable[$taskName]) : false;
}
/**
* Checks if the task should be executed
*
* Task has to be executed if :
* - the task has already been scheduled once and the current system time is greater than the scheduled time.
* - execution is forced, see $forceTaskExecution
*
* @param string $taskName
*
* @return boolean
*/
public function shouldExecuteTask($taskName)
{
$forceTaskExecution = (defined('DEBUG_FORCE_SCHEDULED_TASKS') && DEBUG_FORCE_SCHEDULED_TASKS);
return $forceTaskExecution || ($this->taskHasBeenScheduledOnce($taskName) && time() >= $this->timetable[$taskName]);
}
/**
* Checks if a task should be rescheduled
*
* Task has to be rescheduled if :
* - the task has to be executed
* - the task has never been scheduled before
*
* @param string $taskName
*
* @return boolean
*/
public function taskShouldBeRescheduled($taskName)
{
return !$this->taskHasBeenScheduledOnce($taskName) || $this->shouldExecuteTask($taskName);
}
public function rescheduleTask($task)
{
// update the scheduled time
$this->timetable[$task->getName()] = $task->getRescheduledTime();
$this->save();
}
public function save()
{
Option::set(self::TIMETABLE_OPTION_STRING, serialize($this->timetable));
}
public function getScheduledTimeForMethod($className, $methodName, $methodParameter = null)
{
$taskName = ScheduledTask::getTaskName($className, $methodName, $methodParameter);
return $this->taskHasBeenScheduledOnce($taskName) ? $this->timetable[$taskName] : false;
}
public function taskHasBeenScheduledOnce($taskName)
{
return isset($this->timetable[$taskName]);
}
}
|