Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

PHP e crontab: programmare l'esecuzione degli script

Come eseguire automaticamente istruzioni in PHP su un sistema Linux utilizzando Crontab e l'interfaccia a riga di comando.
Come eseguire automaticamente istruzioni in PHP su un sistema Linux utilizzando Crontab e l'interfaccia a riga di comando.
Link copiato negli appunti

Crontab è un programma utilizzato all'interno di sistemi operativi Linux e Unix per l'esecuzione di determinate istruzioni ad intervalli di tempo regolari o in un particolare momento predefinito dall'utente (scheduling); il crontab è quindi anche un'operazione per la registrazione di comandi che dovranno essere eseguiti automaticamente sulla base di regole stabilite dall'utente, questa operazione viene generalmente scritta all'interno di file che contengono la lista delle istruzioni da eseguire.

Generalmente un'operazione di pianificazione tramite crontab presenta nella sua procedura alcune costanti:

  • l'intervallo di tempo o il momento specifico in cui dovranno essere eseguiti i comandi;
  • il riferimento all'eseguibile che si occuperà di rendere effettive le istruzioni contenute;
  • i comandi da eseguire, cioè le operazioni da compiere;
  • (opzionalmente) l'utente per cui sono validi i comandi da eseguire.

Un classico esempio di crontab è quello relativo alla realizzazione di un file contenente le istruzioni per pianificare nel tempo la creazione di copie di sicurezza di file, record di database o impostazioni di sistema; si tratta di elementi che subiscono spesso delle modifiche, diventa quindi necessario (anche per questioni di sicurezza) programmare dei backup periodici.

Nel corso di questa breve trattazione vedremo come sia possibile creare file di crontab per eseguire operazioni in un linguaggio solitamente destinato ad altri scopi, la generazione di pagine Web, come PHP.

Crontab PHP e directory di esecuzione

In ambiente Linux il crontab si basa sulla presenza di un demone (daemon in lingua Inglese, cioè processo in esecuzione in background) denominato Crond che, senza alcun intervento dell'utente, accede periodicamente (generalmente una volta ogni minuto) ai contenuti del registro dei comandi programmati (cronjobs) e manda in esecuzione quelli previsti per l'intervallo di tempo corrente o per i quali è terminato il periodo di attesa.

Generalmente queste istruzioni sono salvate in file memorizzati all'interno della directory /etc o delle sue sottocartelle.

Per quanto riguarda i crontab realizzati per PHP la procedura non è sostanzialmente differente: possono essere eseguiti tramite crontab tutti i comandi che è possibile richiamare da shell tramite istruzioni da linea di comando e questo è possibile anche per le istruzioni scritte in PHP grazie al supporto per CLI (Command Line Interface).

Un'istruzione da shell può contenere la lista completa delle istruzioni da eseguire, oppure è possibile richiamare il file contenente le istruzioni grazie all'interprete del linguaggio, ad esempio:

/usr/local/bin/php /directory/file.php

Nell'esempio appena esposto, l'interprete (/usr/local/bin/php) non è necessariamente collocato nella stessa directory del file PHP destinato ad eseguire le istruzioni, ma sarà quest'ultimo a generare l'output; se invece si desidera rindirizzare l'output su un terzo file questo dovrà essere specificato nel comando:

/usr/local/bin/php /directory/file.php > /directory/file

Un file crontab funziona nello stesso modo con alcune sostanziali differenze:

  • il comando (o i comandi) non viene lanciato da Shell ma è scritto e memorizzato in un file;
  • l'utente non dovrà intervenire manualmente per l'esecuzione delle istruzioni (anche se queste dovranno essere ripetute più volte);
  • le istruzioni verranno eseguite in un momento specificato dall'utente.

Sintassi di un file Crontab

Per modificare un file crontab all'interno di un sistema Linux si utilizza la seguente sintassi:

# crontab [-e [-u username] | -l [-u username] | -r [-u username] | file]

I parametri utilizzati per eseguire l'istruzione sono i seguenti:

  • -e (edit): indica l'utilizzo dell'editor predefinito per l'editing del file;
  • -l (list): genera la lista dei contenuti del file;
  • -u (username): specifica l'utente per cui sono valide le istruzioni, si tratta di un parametro opzionale , se non viene specificato i comandi saranno validi per l'utente corrente;
  • -r (remove): cancella il file dalla directory di crontab .

Una volta modificato, il file sarà memorizzato nell'apposita directory, nel caso in cui sia già presente un altro file quest'ultimo sarà sovrascritto.

Per scrivere correttamente un file di crontab è necessario rispettare una determinata sintassi, diversamente questo potrebbe non funzionare correttamente; le istruzioni dovranno contenere alcuni parametri obbligatori elencati nella lista seguente:

  • Minuti: espressi con un valore numerico intero che va da "0" a "59", indicano il minuto in cui dovranno essere eseguite le istruzioni;
  • Ore: espresse con un valore numerico intero compreso tra "0" e "23" dove lo zero rappresenta la Mezzanotte, indica l'ora in cui dovranno essere eseguite le istruzioni;
  • Giorno del mese: espresso con un valore numerico intero compreso fra "1" e "31", specifica il giorno del mese in cui devono essere eseguite le istruzioni;
  • Mese: espresso con un valore numerico intero tra "1" e "12", determina il mese in cui dovranno essere eseguite le istruzioni;
  • Giorno della settimana: espresso con un valore numerico intero compreso fra "0" e "6", dove lo zero indica la Domenica e può essere sostituito con la cifra "7", specifica il giorno della settimana in cui devono essere eseguite le istruzioni;
  • Comando: l'istruzione che si intende eseguire.

I parametri elencati potranno essere espressi anche attraverso caratteri speciali da utilizzare in particolare quando si desidera esprimere valori multipli:

  • Virgola (,): da utilizzare senza spazi, è utile per definire una lista di valori, per esempio: "38,49,55" specifica che l'istruzione dovrà essere eseguita durante il trentottesimo minuto, il quarantanovesimo etc.
  • Trattino (-): non prevede spazi e specifica un intervallo, quindi scrivere per esempio: "3-7" equivale a scrivere "3,4,5,6,7";
  • Asterisco (*), è un carattere sostitutivo, utilizzato per esempio al posto del giorno del mese significa qualsiasi giorno del mese.

L'ultimo carattere speciale potrà essere utilizzato al posto di uno qualsiasi dei primi 5 parametri elencati in precedenza; per cui, volendo fare degli esempi si avrà che:

  • 12,50 * * * * /directory/istruzioni: definisce un comando che verrà eseguito due volte al giorno ad ogni dodicesimo e cinquantesimo minuto di qualsiasi ora del giorno;
  • 0 12 * * * /directory/istruzioni: definisce l'ora esatta in cui dovrà essere eseguito il comando (le 12:00);
  • 50 10 15,16 * * /directory/istruzioni: "50" indica i minuti, "10" indica l'ora, "15" e "16" sono invece i giorni del mese, il comando dovrà quindi essere eseguito alle 10:50 del 15 e del 16 di ogni mese;
  • * * * * * /directory/istruzioni: definisce un comando che dovrà essere eseguito ogni minuto indipendentemente dal giorno.

Opzionalmente, oltre ai parametri specificati, sarà possibile associare alle istruzioni per il crontab due ulteriori argomenti:

  • un Log file: utile per memorizzare le attività di crontab che potrà essere specificato con un doppio simbolo "maggiore" (ad esempio: >>file.log);
  • un Error file: utile per memorizzare gli eventuali errori prodotti durante l'esecuzione delle istruzioni di crontab, si definisce con un 2 seguito un doppio simbolo "maggiore" (ad esempio: 2>>file.err).

Nel creare un file di crontab per PHP è bene tenere presente che l'output generato dalle istruzioni non è destinato alla visualizzazione tramite browser, per questo motivo non sarà necessario utilizzare markup HTML.

Un semplice esempio pratico di file Crontab in PHP

Si prenda come esempio il seguente script PHP:

<?php   
# registrazione della data corrente in una variabile   
$oggi = date('Y-m-d'); 
# apertura in scrittura di un file di log
$log = fopen("./logs/".$oggi."_log.txt","w") or die ("Impossibile creare il file ".$oggi. "_log.txt.");
# scrittura della data corrente sul file di log      
$scrivi = fwrite($log,"Eseguito il ".date('Y-m-d H:i:s'));  
#chiusura del file      
fclose($log);
?>

L'applicazione funziona in modo molto semplice:

  • registra la data odierna;
  • crea e apre un file di log denominato con la data corrente;
  • scrive data e ora corrente nel file;
  • chiude il file.

Ora si immagini di salvare lo script in un file chiamato cron.php e di voler eseguire il codice contenuto in esso ad intervalli di tempo regolari grazie all'utilizzo del crontab. Per esempio, se si desiderasse eseguire cron.php ogni Giovedì alle 14:55 sarà necessario creare un file di crontab contenente la seguente istruzione da scrivere in una sola riga:

55 14 * * 4  php  --q  directory/cron.php

Il primo e il secondo valore ("55" e "14") indicheranno rispettivamente i minuti e l'ora; i due asterischi indicheranno rispettivamente tutti i giorni del mese e tutti i mesi; "4" indicherà il 4° giorno della settimana.

L'istruzione contenuta nel file di crontab (php --q directory/cron.php) garantirà l'esecuzione del codice contenuto in cron.php nel periodo di tempo previsto.

Conclusioni

Pianificare attraverso crontab l'esecuzione di determinate applicazioni PHP in periodi predefiniti di tempo può risultare una procedura molto utile per limitare il numero di operazioni da compiere manualmente. È possibile creare file di crontab per effettuare copie di salvataggio di dati, inviare posta elettronica, temporizzate la pubblicazione di articoli su un blog, eliminare record inutili, ottimizzare tabelle e molto altro.

Anche se la sintassi necessaria per la creazione di file di crontab è molto semplice, è bene osservare attentamente le regole previste per questo tipo di documenti in modo da evitare malfunzionamenti.

In questa brave trattazione sono stati quindi affrontati tutti gli argomenti necessari (parametri obbligatori ed opzionali, sintassi, caratteri speciali,regole di allineamento etc.) per procedere alla creazione di file di crontab per PHP.

Ti consigliamo anche