mirror of
https://github.com/devcode-it/openstamanager.git
synced 2025-01-11 07:05:22 +01:00
Introduzione sistema di cron per la gestione di task ricorrenti
This commit is contained in:
parent
0f1e291629
commit
333a7b33f2
@ -24,6 +24,7 @@
|
||||
"php": ">=5.6",
|
||||
"ext-curl": "*",
|
||||
"ext-dom": "*",
|
||||
"ext-fileinfo": "*",
|
||||
"ext-intl": "*",
|
||||
"ext-json": "*",
|
||||
"ext-libxml": "*",
|
||||
@ -33,10 +34,10 @@
|
||||
"ext-simplexml": "*",
|
||||
"ext-xsl": "*",
|
||||
"ext-zip": "*",
|
||||
"ext-fileinfo": "*",
|
||||
"aluguest/ical-easy-reader": "^1.5",
|
||||
"danielstjules/stringy": "^3.1",
|
||||
"davidepastore/codice-fiscale": "^0.4.0",
|
||||
"dragonmantank/cron-expression": "^3.0",
|
||||
"ezyang/htmlpurifier": "^4.8",
|
||||
"filp/whoops": "^2.1",
|
||||
"guzzlehttp/guzzle": "^6.3",
|
||||
@ -82,9 +83,6 @@
|
||||
"sort-packages": true,
|
||||
"optimize-autoloader": true,
|
||||
"apcu-autoloader": true,
|
||||
"prefer-stable": true,
|
||||
"platform": {
|
||||
"php": "5.6.4"
|
||||
}
|
||||
"prefer-stable": true
|
||||
}
|
||||
}
|
||||
|
88
cron.php
Normal file
88
cron.php
Normal file
@ -0,0 +1,88 @@
|
||||
<?php
|
||||
/**
|
||||
* Script dedicato alla gestione delle operazioni di cron ricorrenti del gestionale.
|
||||
* Una volta attivato, questo script rimane attivo in background per gestire l'esecuzione delle diverse operazioni come pianificate nella tabella zz_tasks.
|
||||
*
|
||||
* Il file viene richiamato in automatico al login di un utente.
|
||||
* Per garantire che lo script resti attivo in ogni situazione, si consiglia di introdurre una chiamata nel relativo crontab di sistema secondo il seguente schema:
|
||||
*/
|
||||
// Schema crontab: "*/5 * * * * php <percorso_root>/cron.php"
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Models\Cache;
|
||||
use Monolog\Handler\RotatingFileHandler;
|
||||
use Monolog\Logger;
|
||||
use Tasks\CronExpression;
|
||||
use Tasks\Task;
|
||||
|
||||
// Rimozione delle limitazioni sull'esecuzione
|
||||
//set_time_limit(0);
|
||||
//ignore_user_abort(true);
|
||||
|
||||
// Chiusura della richiesta alla pagina
|
||||
//flush();
|
||||
|
||||
$skip_permissions = true;
|
||||
include_once __DIR__.'/core.php';
|
||||
|
||||
// Disabilita della sessione
|
||||
session_write_close();
|
||||
|
||||
// Aggiunta di un logger specifico
|
||||
$logger = new Logger('Tasks');
|
||||
$handler = new RotatingFileHandler(DOCROOT.'/logs/cron_Test.log', 0);
|
||||
$handler->setFormatter($monologFormatter);
|
||||
$logger->pushHandler($handler);
|
||||
|
||||
// Lettura della cache
|
||||
$ultima_esecuzione = Cache::get('Ultima esecuzione del cron');
|
||||
$data = $ultima_esecuzione->content;
|
||||
|
||||
// Impostazioni sugli slot di esecuzione
|
||||
$slot_duration = 5;
|
||||
|
||||
// Controllo sull'ultima esecuzione
|
||||
$data = $data ? new Carbon($data) : null;
|
||||
$minimo_esecuzione = (new Carbon())->addMinutes($slot_duration * 5);
|
||||
if (!empty($data) && $data->greaterThanOrEqualTo($minimo_esecuzione)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Calcolo del primo slot disponibile
|
||||
$adesso = new Carbon();
|
||||
$slot = (new Carbon())->startOfHour();
|
||||
while ($adesso->greaterThanOrEqualTo($slot)) {
|
||||
$slot->addMinutes($slot_duration);
|
||||
}
|
||||
|
||||
// Esecuzione ricorrente
|
||||
$number = 1;
|
||||
while (true) {
|
||||
// Risveglio programmato tramite slot
|
||||
$timestamp = $slot->getTimestamp();
|
||||
time_sleep_until($timestamp);
|
||||
|
||||
// Registrazione nei log
|
||||
$logger->info('Cron #'.$number.' (slot timestamp: '.$timestamp.')');
|
||||
|
||||
// Aggiornamento dei cron disponibili
|
||||
$tasks = Task::all();
|
||||
foreach ($tasks as $task) {
|
||||
$cron = CronExpression::factory($task->expression);
|
||||
|
||||
// Esecuzione diretta solo nel caso in cui sia prevista
|
||||
if ($cron->isDue()) {
|
||||
$task->execute();
|
||||
}
|
||||
}
|
||||
|
||||
// Registrazione dell'esecuzione
|
||||
$adesso = new Carbon();
|
||||
$ultima_esecuzione->set($adesso->__toString());
|
||||
|
||||
// Individuazione dello slot di 5 minuti per l'esecuzione successiva
|
||||
while ($adesso->greaterThanOrEqualTo($slot)) {
|
||||
$slot->addMinutes($slot_duration);
|
||||
}
|
||||
++$number;
|
||||
}
|
15
src/Tasks/Manager.php
Normal file
15
src/Tasks/Manager.php
Normal file
@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
namespace Tasks;
|
||||
|
||||
abstract class Manager implements TaskInterface
|
||||
{
|
||||
protected $task;
|
||||
|
||||
public function __construct(Task $task)
|
||||
{
|
||||
$this->task = $task;
|
||||
}
|
||||
|
||||
abstract public function execute();
|
||||
}
|
39
src/Tasks/Task.php
Normal file
39
src/Tasks/Task.php
Normal file
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
namespace Tasks;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Common\Model;
|
||||
|
||||
/**
|
||||
* Risorsa per la gestione delle task ricorrenti del gestionale.
|
||||
*/
|
||||
class Task extends Model
|
||||
{
|
||||
protected $table = 'zz_tasks';
|
||||
|
||||
protected $dates = [
|
||||
'last_executed_at',
|
||||
];
|
||||
|
||||
public function execute()
|
||||
{
|
||||
// Individuazione del gestore
|
||||
$class = $this->attributes['class'];
|
||||
$manager = new $class($this);
|
||||
|
||||
// Esecuzione
|
||||
$result = $manager->execute();
|
||||
|
||||
// Salvtagggio dell'esecuzione
|
||||
$this->last_executed_at = new Carbon();
|
||||
$this->save();
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function delete()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
11
src/Tasks/TaskInterface.php
Normal file
11
src/Tasks/TaskInterface.php
Normal file
@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace Tasks;
|
||||
|
||||
interface TaskInterface
|
||||
{
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public function execute();
|
||||
}
|
12
update/2_4_18.sql
Normal file
12
update/2_4_18.sql
Normal file
@ -0,0 +1,12 @@
|
||||
-- Miglioramento della cache interna
|
||||
CREATE TABLE IF NOT EXISTS `zz_tasks` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`name` VARCHAR(255) NOT NULL,
|
||||
`class` TEXT NOT NULL,
|
||||
`expression` VARCHAR(255) NOT NULL,
|
||||
`last_executed_at` timestamp NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
INSERT INTO `zz_cache` (`id`, `name`, `content`, `valid_time`, `expire_at`) VALUES
|
||||
(NULL, 'Ultima esecuzione del cron', '', '1 month', NULL);
|
Loading…
Reference in New Issue
Block a user