Buongiorno
@Phelps , ti spiego cosa fare e veramente sono solo 2 semplici operazioni:
1: Crea una tabella sul DB (potresti utilizzare anche un file csv,yaml etc...) con:
- ID -> integer autoincrement
- call -> varchar(255) //questa è la funzione che dovrai richiamare
- is_enable -> bool default 1
- created_at -> datetime
- available_at -> datetime
In in "call" devi memorizzare il metodo di una classe e/o una funzione che vuoi eseguire, in available_at metti la data e l'orario di quando è possibile effettuare il lavoro (job) messo in coda (queue).
Ipotizziamo di avere una classe "Worker.php" e di voler avviare il Task:
cron style: */1 * * * * php /directory/applicazione/Werker.php
Cosa significa? Abbiamo avviato un Task che parte ogni minuto.
Immaginiamo di avere 2 metodi all'interno di Worker.php
PHP:
public $data=[];
public $limit=10;
public $conn;
public $current_index=0;
/**
*Costruttore
*/
public function __constructor(){
$this->conn=new Connection(); //imposta la tua connessione con la lib che ti piace
$this->getData();
}
/**
* Ottiene le chiamate da effettuare
*/
public function getData(){
$this->data=$this->conn->query('SELECT BLA BLA BLA FROM TABLE WHERE BLA = BLABLA LIMIT '.$this->limit);
return $this;
}
/**
* Aggiorna lo stato di un Job
*/
public function updateJob(){
$this->conn->query('AGGIORNA I DATI WORKER PER DISATTIVARLO WHERE id = '.$this->data[$this->current_index]['id']);
}
/**
* Ping su di una pagina (esempio)
*/
public function pingPage(){
//file_get_contents solo per semplicità
file_get_contents('https://pagina');
}
/**
* Invia parametri (esempio)
*/
public function sendParams(){
}
Ora immagina che getData abbia estratto una riga del genere:
id=1
call=pingPage
is_enable=1
created_at=2019-10-15 09:00:00
available_at=2019-10-17 09:15:00
Quindi sappiamo che dobbiamo chiamare il metodo pingPage il 17 Ottobre 2019 alle ore 9:15 di mattina.
Alla fine della classe dobbiamo richiamare questi metodi in questo modo:
PHP:
//Inizializzo la classe che automaticamente recupererà i dati dal BD
$worker=new Worker();
//Inizio a ciclare i dati estratti
//ipotizzo estrazione ad array
foreach($worker->data as $chiave=>$valore){
//controllo se il metodo esiste all'interno della classe
if(method_exists($worker,$valore['call'])){
//var appoggio
$worker->current_index=$k;
//chiamo il metodo della classe memorizzato in call
call_user_func([$worker,$valore['call']]);
//aggiorno il worker per renderlo disattivo
$worker->updateJob();
}
}
Sembra complicato, invece è veramente una cavolata...
Naturalmente non ho gestito il available_at in quanto dovresti farlo da query, per recuperare le risorse in :
is_enable = 1 AND available_at = TUA CONDIZIONE