diff --git a/cron.php b/cron.php index bf76037b8..fe97a2311 100644 --- a/cron.php +++ b/cron.php @@ -46,6 +46,7 @@ $logger->pushHandler($handler); $ultima_esecuzione = Cache::get('Ultima esecuzione del cron'); $data = $ultima_esecuzione->content; +$in_esecuzione = Cache::get('Cron in esecuzione'); $cron_id = Cache::get('ID del cron'); $disattiva = Cache::get('Disabilita cron'); @@ -79,6 +80,7 @@ $number = 1; while (true) { $disattiva->refresh(); $cron_id->refresh(); + $in_esecuzione->refresh(); // Controllo su possibili aggiornamenti per bloccare il sistema $database_online = $database->isInstalled() && !Update::isUpdateAvailable(); @@ -94,6 +96,7 @@ while (true) { // Risveglio programmato tramite slot $timestamp = $slot_minimo->getTimestamp(); time_sleep_until($timestamp); + $in_esecuzione->set(true); // Registrazione dell'iterazione nei log $logger->info('Cron #'.$number.' iniziato', [ @@ -160,6 +163,7 @@ while (true) { 'next-slot' => $slot_minimo->toDateTimeString(), 'next-slot-unix' => $timestamp, ]); + $in_esecuzione->set(false); // Registrazione dell'esecuzione $adesso = new Carbon(); diff --git a/src/API/Common/Task.php b/src/API/Common/Task.php index d42627b57..8dbdc65a9 100644 --- a/src/API/Common/Task.php +++ b/src/API/Common/Task.php @@ -5,6 +5,7 @@ namespace API\Common; use API\Interfaces\CreateInterface; use API\Interfaces\RetrieveInterface; use API\Resource; +use Carbon\Carbon; use Models\Cache; use Tasks\Log; @@ -23,6 +24,8 @@ class Task extends Resource implements RetrieveInterface, CreateInterface public function create($request) { + $database = database(); + // Rimozione della registrazione del cron attuale $ultima_esecuzione = Cache::get('Ultima esecuzione del cron'); $ultima_esecuzione->set(null); @@ -35,8 +38,23 @@ class Task extends Resource implements RetrieveInterface, CreateInterface $disattiva = Cache::get('Disabilita cron'); $disattiva->set(null); + // Salvataggio delle modifiche + $database->commitTransaction(); + + // Attesa della conclusione per il cron precedente + $in_esecuzione = Cache::get('Cron in esecuzione'); + while ($in_esecuzione->content) { + $timestamp = (new Carbon())->addMinutes(1)->getTimestamp(); + time_sleep_until($timestamp); + + $in_esecuzione->refresh(); + } + // Chiamata al cron per l'avvio $this->request(); + + // Riavvio transazione + $database->beginTransaction(); } /** diff --git a/src/API/Manager.php b/src/API/Manager.php index 729777981..dc5e81ed8 100755 --- a/src/API/Manager.php +++ b/src/API/Manager.php @@ -6,6 +6,7 @@ use API\Exceptions\InternalError; use API\Exceptions\ResourceNotFound; use Auth; use Models\ApiResource as Resource; +use PDOException; /** * Classe per la gestione delle API del progetto. diff --git a/update/2_4_18.sql b/update/2_4_18.sql index a0fd71612..e04e1a8b9 100644 --- a/update/2_4_18.sql +++ b/update/2_4_18.sql @@ -22,7 +22,7 @@ CREATE TABLE IF NOT EXISTS `zz_tasks_logs` ( INSERT INTO `zz_cache` (`id`, `name`, `content`, `valid_time`, `expire_at`) VALUES (NULL, 'Ultima esecuzione del cron', '', '1 month', NULL), (NULL, 'ID del cron', '', '1 month', NULL), -(NULL, 'Riavvia cron', '', '1 month', NULL), +(NULL, 'Cron in esecuzione', '', '1 month', NULL), (NULL, 'Disabilita cron', '', '1 month', NULL); INSERT INTO `zz_tasks` (`id`, `name`, `class`, `expression`, `last_executed_at`) VALUES