Skip to content

Commit d541d7a

Browse files
committed
Correzioni sulle tasks
1 parent 577bf0d commit d541d7a

5 files changed

Lines changed: 116 additions & 17 deletions

File tree

‎cron.php‎

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
// Schema crontab: "*/5 * * * * php <percorso_root>/cron.php"
1010

1111
use Carbon\Carbon;
12-
use Cron\CronExpression;
1312
use Models\Cache;
1413
use Monolog\Handler\RotatingFileHandler;
1514
use Monolog\Logger;
@@ -47,6 +46,8 @@
4746
$ultima_esecuzione = Cache::get('Ultima esecuzione del cron');
4847
$data = $ultima_esecuzione->content;
4948

49+
$cron_id = Cache::get('ID del cron');
50+
5051
$riavvia = Cache::get('Riavvia cron');
5152
$disattiva = Cache::get('Disabilita cron');
5253
if (!empty($disattiva->content)) {
@@ -58,11 +59,15 @@
5859

5960
// Controllo sull'ultima esecuzione
6061
$data = $data ? new Carbon($data) : null;
61-
$minimo_esecuzione = (new Carbon())->addMinutes($slot_duration * 5);
62+
$minimo_esecuzione = (new Carbon())->subMinutes($slot_duration * 5);
6263
if (!empty($data) && $minimo_esecuzione->lessThan($data)) {
6364
return;
6465
}
6566

67+
// Generazione e registrazione del cron
68+
$current_id = random_string();
69+
$cron_id->set($current_id);
70+
6671
// Registrazione dell'esecuzione
6772
$adesso = new Carbon();
6873
$ultima_esecuzione->set($adesso->__toString());
@@ -75,10 +80,11 @@
7580
while (true) {
7681
$riavvia->refresh();
7782
$disattiva->refresh();
83+
$cron_id->refresh();
7884

7985
// Controllo su possibili aggiornamenti per bloccare il sistema
8086
$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) {
8288
return;
8389
}
8490

@@ -93,8 +99,7 @@
9399
]);
94100

95101
// 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();
98103
$slot_minimo = $inizio_iterazione->copy()->startOfHour();
99104
while ($inizio_iterazione->greaterThanOrEqualTo($slot_minimo)) {
100105
$slot_minimo->addMinutes($slot_duration);
@@ -105,25 +110,40 @@
105110
foreach ($tasks as $task) {
106111
$adesso = new Carbon();
107112

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+
}
111119

112120
// 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)) {
114122
// Registrazione dell'esecuzione nei log
115123
$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+
}
118134
}
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+
]);
119140

120-
// Salvataggio della data per l'esecuzione susccessiva
121-
$task->next_execution_at = $data_successiva;
122-
$task->save();
141+
$task->registerMissedExecution($inizio_iterazione);
142+
}
123143

124144
// 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;
127147
}
128148
}
129149

‎src/Tasks/Log.php‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace Tasks;
4+
5+
use Common\Model;
6+
7+
/**
8+
* Risorsa per la gestione dei log per le task ricorrenti del gestionale.
9+
*/
10+
class Log extends Model
11+
{
12+
protected $table = 'zz_tasks_logs';
13+
14+
protected $casts = [
15+
'context' => 'array',
16+
];
17+
18+
public function task()
19+
{
20+
return $this->belongsTo(Task::class, 'id_task');
21+
}
22+
}

‎src/Tasks/Task.php‎

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Carbon\Carbon;
66
use Common\Model;
7+
use Cron\CronExpression;
78

89
/**
910
* Risorsa per la gestione delle task ricorrenti del gestionale.
@@ -17,8 +18,24 @@ class Task extends Model
1718
'last_executed_at',
1819
];
1920

21+
public function log($level, $message, $context = [])
22+
{
23+
$log = Log::build();
24+
25+
$log->level = $level;
26+
$log->message = $message;
27+
$log->context = $context;
28+
29+
$log->task()->associate($this);
30+
31+
$log->save();
32+
}
33+
2034
public function execute()
2135
{
36+
// Registrazione dell'inizio nei log
37+
$this->log('info', 'Inizio esecuzione');
38+
2239
// Individuazione del gestore
2340
$class = $this->attributes['class'];
2441
$manager = new $class($this);
@@ -28,13 +45,41 @@ public function execute()
2845

2946
// Salvtagggio dell'esecuzione
3047
$this->last_executed_at = new Carbon();
48+
49+
// Individuazione della data per la prossima esecuzione dalla relativa espressione
50+
$this->registerNextExecution($this->last_executed_at);
3151
$this->save();
3252

53+
// Registrazione del completamento nei log
54+
$this->log('info', 'Fine esecuzione');
55+
3356
return $result;
3457
}
3558

59+
public function registerMissedExecution(Carbon $now)
60+
{
61+
// Registrazione del completamento nei log
62+
$this->log('warning', 'Esecuzione mancata', [
63+
'timestamp' => $this->next_execution_at->toDateTimeString(),
64+
]);
65+
66+
$this->registerNextExecution($now);
67+
$this->save();
68+
}
69+
70+
public function registerNextExecution(Carbon $now)
71+
{
72+
$cron = CronExpression::factory($this->expression);
73+
$this->next_execution_at = Carbon::instance($cron->getNextRunDate($now));
74+
}
75+
3676
public function delete()
3777
{
3878
return false;
3979
}
80+
81+
public function logs()
82+
{
83+
return $this->hasMany(Log::class, 'id_task');
84+
}
4085
}

‎update/2_4_18.sql‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,24 @@ CREATE TABLE IF NOT EXISTS `zz_tasks` (
99
PRIMARY KEY (`id`)
1010
) ENGINE=InnoDB;
1111

12+
CREATE TABLE IF NOT EXISTS `zz_tasks_logs` (
13+
`id` int(11) NOT NULL AUTO_INCREMENT,
14+
`id_task` int(11),
15+
`level` VARCHAR(255) NOT NULL,
16+
`message` TEXT NOT NULL,
17+
`context` TEXT NOT NULL,
18+
PRIMARY KEY (`id`),
19+
FOREIGN KEY (`id_task`) REFERENCES `zz_tasks`(`id`)
20+
) ENGINE=InnoDB;
21+
1222
INSERT INTO `zz_cache` (`id`, `name`, `content`, `valid_time`, `expire_at`) VALUES
1323
(NULL, 'Ultima esecuzione del cron', '', '1 month', NULL),
24+
(NULL, 'ID del cron', '', '1 month', NULL),
1425
(NULL, 'Riavvia cron', '', '1 month', NULL),
1526
(NULL, 'Disabilita cron', '', '1 month', NULL);
1627

1728
INSERT INTO `zz_tasks` (`id`, `name`, `class`, `expression`, `last_executed_at`) VALUES
18-
(NULL, 'Backup automatico', 'Modules\\Backups\\BackupTask', '0 0 * * *', NULL);
29+
(NULL, 'Backup automatico', 'Modules\\Backups\\BackupTask', '0 1 * * *', NULL);
1930

2031
DELETE FROM `zz_hooks` WHERE `class` = 'Modules\\Backups\\BackupHook';
2132

‎update/tables.php‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@
122122
'zz_semaphores',
123123
'zz_settings',
124124
'zz_tasks',
125+
'zz_tasks_logs',
125126
'zz_tokens',
126127
'zz_users',
127128
'zz_user_sedi',

0 commit comments

Comments
 (0)