|
9 | 9 | // Schema crontab: "*/5 * * * * php <percorso_root>/cron.php" |
10 | 10 |
|
11 | 11 | use Carbon\Carbon; |
12 | | -use Cron\CronExpression; |
13 | 12 | use Models\Cache; |
14 | 13 | use Monolog\Handler\RotatingFileHandler; |
15 | 14 | use Monolog\Logger; |
|
47 | 46 | $ultima_esecuzione = Cache::get('Ultima esecuzione del cron'); |
48 | 47 | $data = $ultima_esecuzione->content; |
49 | 48 |
|
| 49 | +$cron_id = Cache::get('ID del cron'); |
| 50 | + |
50 | 51 | $riavvia = Cache::get('Riavvia cron'); |
51 | 52 | $disattiva = Cache::get('Disabilita cron'); |
52 | 53 | if (!empty($disattiva->content)) { |
|
58 | 59 |
|
59 | 60 | // Controllo sull'ultima esecuzione |
60 | 61 | $data = $data ? new Carbon($data) : null; |
61 | | -$minimo_esecuzione = (new Carbon())->addMinutes($slot_duration * 5); |
| 62 | +$minimo_esecuzione = (new Carbon())->subMinutes($slot_duration * 5); |
62 | 63 | if (!empty($data) && $minimo_esecuzione->lessThan($data)) { |
63 | 64 | return; |
64 | 65 | } |
65 | 66 |
|
| 67 | +// Generazione e registrazione del cron |
| 68 | +$current_id = random_string(); |
| 69 | +$cron_id->set($current_id); |
| 70 | + |
66 | 71 | // Registrazione dell'esecuzione |
67 | 72 | $adesso = new Carbon(); |
68 | 73 | $ultima_esecuzione->set($adesso->__toString()); |
|
75 | 80 | while (true) { |
76 | 81 | $riavvia->refresh(); |
77 | 82 | $disattiva->refresh(); |
| 83 | + $cron_id->refresh(); |
78 | 84 |
|
79 | 85 | // Controllo su possibili aggiornamenti per bloccare il sistema |
80 | 86 | $database_online = $database->isInstalled() && !Update::isUpdateAvailable(); |
81 | | - if (!$database_online || !empty($disattiva->content) || !empty($riavvia->content)) { |
| 87 | + if (!$database_online || !empty($disattiva->content) || !empty($riavvia->content) || $cron_id->content != $current_id) { |
82 | 88 | return; |
83 | 89 | } |
84 | 90 |
|
|
93 | 99 | ]); |
94 | 100 |
|
95 | 101 | // Calcolo del primo slot disponibile per l'esecuzione successiva |
96 | | - $inizio_iterazione = new Carbon(); |
97 | | - $inizio_programmato_iterazione = $slot_minimo->copy(); |
| 102 | + $inizio_iterazione = $slot_minimo->copy(); |
98 | 103 | $slot_minimo = $inizio_iterazione->copy()->startOfHour(); |
99 | 104 | while ($inizio_iterazione->greaterThanOrEqualTo($slot_minimo)) { |
100 | 105 | $slot_minimo->addMinutes($slot_duration); |
|
105 | 110 | foreach ($tasks as $task) { |
106 | 111 | $adesso = new Carbon(); |
107 | 112 |
|
108 | | - // Individuazione delle informazioni previste dalla relativa espressione |
109 | | - $cron = CronExpression::factory($task->expression); |
110 | | - $data_successiva = Carbon::instance($cron->getNextRunDate($adesso)); |
| 113 | + // Registrazione della data per l'esecuzione se non indicata |
| 114 | + if (empty($task->next_execution_at)) { |
| 115 | + dd($task->next_execution_at); |
| 116 | + $task->registerNextExecution($inizio_iterazione); |
| 117 | + $task->save(); |
| 118 | + } |
111 | 119 |
|
112 | 120 | // Esecuzione diretta solo nel caso in cui sia prevista |
113 | | - if (!empty($task->next_execution_at) && $task->next_execution_at->greaterThanOrEqualTo($inizio_iterazione) && $task->next_execution_at->lessThanOrEqualTo($adesso)) { |
| 121 | + if ($task->next_execution_at->greaterThanOrEqualTo($inizio_iterazione) && $task->next_execution_at->lessThanOrEqualTo($adesso)) { |
114 | 122 | // Registrazione dell'esecuzione nei log |
115 | 123 | $logger->info($task->name.': '.$task->expression); |
116 | | - |
117 | | - $task->execute(); |
| 124 | + try { |
| 125 | + $task->execute(); |
| 126 | + } catch (Exception $e) { |
| 127 | + // Registrazione del completamento nei log |
| 128 | + $this->log('error', 'Errore di esecuzione', [ |
| 129 | + 'code' => $e->getCode(), |
| 130 | + 'message' => $e->getMessage(), |
| 131 | + 'trace' => $e->getTraceAsString(), |
| 132 | + ]); |
| 133 | + } |
118 | 134 | } |
| 135 | + // Esecuzione mancata |
| 136 | + elseif ($task->next_execution_at->lessThan($inizio_iterazione)) { |
| 137 | + $logger->info($task->name.': mancata', [ |
| 138 | + 'timestamp' => $task->next_execution_at->toDateTimeString(), |
| 139 | + ]); |
119 | 140 |
|
120 | | - // Salvataggio della data per l'esecuzione susccessiva |
121 | | - $task->next_execution_at = $data_successiva; |
122 | | - $task->save(); |
| 141 | + $task->registerMissedExecution($inizio_iterazione); |
| 142 | + } |
123 | 143 |
|
124 | 144 | // Calcolo dello successivo slot |
125 | | - if ($data_successiva->lessThan($slot_minimo)) { |
126 | | - $slot_minimo = $data_successiva; |
| 145 | + if ($task->next_execution_at->lessThan($slot_minimo)) { |
| 146 | + $slot_minimo = $task->next_execution_at; |
127 | 147 | } |
128 | 148 | } |
129 | 149 |
|
|
0 commit comments