Eseguire una Query al DB ogni giorno - Drupal 6.x

16 contenuti / 0 new
Ultimo contenuto
Eseguire una Query al DB ogni giorno - Drupal 6.x

Ciao a tutti, sono di nuovo qui per chiedere aiuto per risolvere un problema:

Io sto creando un sito che gestisca delle scadenze e vorrei che il sistema una volta al giorno eseguisse una query al Database per richiedere, ad esempio, quali contratti scadranno a 6 mesi dal giorno in cui viene eseguita la query.

Ho cercato in rete e ho trovato qualcosa riguardo a Rules e Trigger, ma non mi pare sia quello che mi serva, qualcuno ha qualche suggerimento?

Grazie in anticipo a tutti

Io questa cosa l'ho risolta creando un modulo con all'interno la funzione hook_cron. Questo fa sì che i comandi all'interno della funzione vengano eseguiti ogni volta che si esegue il cron. Se esegui il cron una volta al giorno OK, altrimenti, se lo esegui più spesso, dovrai mettere un po' di logica per determinare quando hai eseguito l'ultima volta il controllo e se sei nel giorno successivo.

grazie pinolo, cercherò di fare qualcosa di simile a quanto hai fatto tu

ho controllato un po' come funziona Cron e non c'ho capito moltissimo...

Però ho visto che se inserisco il codice php in cron.php mi esegue correttamente il tutto.

Ho però 2 dubbi:
1. E' corretto fare come ho fatto? mi si possono presentare inconvenienti?
2. Cron.php viene eseguito automaticamente da Drupal? ogni quanto(mi pare di aver letto che di default viene eseguito una volta al giorno, che per me andrebbe pure benissimo..).

l'esecuzione di cron dev'essere impostata lato server: http://drupal.org/cron
per chi non ha shell access o, disgraziatamente, si trova su un server windows (e non puo' impostare scheduled tasks) esiste il modulo http://drupal.org/projects/pooormanscron
che esegue cron.php quando gli utenti visitano il sito, agli intervalli di tempo impostati

scusa l'ignoranza ma non ho capito benissimo.
intanto comincio con il dire che ora come ora sto lavorando in locale con MAMP, ho seguito il link che mi hai postato(questo)ma non ho capito bene una cosa:
Per fargli eseguire qualcosa devo mettere una url come questa:
"5 * * * * /usr/bin/curl --silent --compressed http://localhost:8888/cron.php"
ma devo creare una pagina php (tipo mio_cron.php) e sostituirla al cron.php nell'indirizzo sopra?

altrimenti come posso assegnargli dei compiti (in particolare query sql) esclusivamente da linea di comando???

query sql da linea di comando è meglio se te le scordi ^^

non conosco l'ambiente Mac (mi pare di capire che si usi launchd), ma negli ambienti Unix-like c'è un programma in esecuzione, il demone cron, che esegue determinati comandi ad intervalli regolari.

di solito i servizi di hosting offrono la possibilità di aggiungere tramite interfaccia web i comandi cron da eseguire. vedi tu se in ambiente Mac ti può essere utile gestirli tramite qualche GUI...

ad ogni modo, copia le prime due righe di codice dal file cron.php ed incollale in un nuovo file scadenze.php, dopodiché scrivi il codice (db_query(), ecc.) che devi scrivere per interrogare il db, inviare avvisi, eccetera, e infine aggiungi un comando cron che esegua lo script stesso una volta al giorno.

ad es. "0 0 * * * php -f scadenze.php" (senza virgolette) avvia PHP ed esegue scadenze.php ogni mezzanotte.

fammi sapere se funziona.
non ti assicuro niente, non ho mai provato a farlo ma credo che comunque dovrebbe andare.

ciao, giovanni

Tostau, mettere il codice da eseguire in cron.php non è esattamente una best practice...
Ogni volta che aggiorni Drupal, il file viene sovrascritto. Se invece fai un modulo che implementa hook_cron puoi aggiornare tutto quello che ti pare.

Ecco un template per la tua funzione hook_cron...

/**
* Implementazione hook_cron
**/
function miomodulo_cron() {
  // variabile di sistema: definisce quando è stato eseguita l'ultima operazione
  $last_run = variable_get('miomodulo_ultimocron', 0);
  // controllo se il giorno attuale è maggiore del giorno dell'ultima esecuzione
  if (date('Y-m-d') > date('Y-m-d', $last_run)) {
    // Faccio cose...
    // Aggiorno la variabile che registra l'esecuzione
    variable_set('miomodulo_ultimocron', time());
  }
}

bravissimo, grazie pinolo.

Temevo proprio di fare una porcata.. domani ci rimetto mano seguendo lo schema che mi hai suggerito, grazie 1000

Penso di aver fatto tutto nella giusta maniera.
Ho, credo, l'ultima domanda: come faccio a vedere se funziona? per ora gli faccio fare una INSERT nel DB di un contratto che poi cancellerò per vedere se viene eseguito il modulo, ma vorrei sapere ogni quanto cron viene eseguito, se funziona anche in locale..

Per far girare il cron, vai nella pagina del rapporto e da lì lo puoi lanciare manualmente.

Sono tornato a provare ma non mi funziona... Di seguito posto il codice per poter essere + chiaro. Specifico cosa ho fatto:

Ho creato un modulo miohookmodule in cui ho implementato 3 file: .info, .install e .module. Quello sotto è il file miohookmodule.module, però questo file non viene eseguito (come test ho inserito una insert nel DB di un contratto fasullo). Ho provato ad eseguire la query da phpmyadmin e funziona. Il mio dubbio è che proprio non venga invocato il modulo..

Mi scoccia essere così "ignorante" in materia, ma non capisco come far invocare questo modulo da Cron..
Altra cosa io non ho fatto come dice copyfight, che debba inserire il comando 0 0 * * * php -f scadenze.php per far funzionare la cosa? Nel caso dove lo devo mettere? nel file .module?

<?php
include_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
drupal_cron_run();
/**
* Implementazione di hook_help()
*/
function miohookmodule_help($section, $arg)
{
    switch(
$section)
    {
        case
'admin/help#testblock':
            return
'mioHookModule riguarda la notifica di scadenze dei contratti';
    }
}
function
miohookmodule_cron()
{
   
// variabile di sistema: definisce quando è stato eseguita l'ultima operazione
 
$last_run = variable_get('miohookmodule_ultimocron', 0);
 
// controllo se il giorno attuale è maggiore del giorno dell'ultima esecuzione
 
if (date('Y-m-d') > date('Y-m-d', $last_run))
  {
   
$host=localhost;
   
$user_query=*****;
   
$pass="******";
   
$database=********;
   
$db = mysql_connect($host,$user_query,$pass);
    if (
$db == FALSE) echo "Errore nella connessione";
   
mysql_select_db($database, $db);
   
$query2="INSERT into Contratto (Numero, Tipo, Locatore, Conduttore, Dati_Immobile, Data_ERCL, Serie_ERCL, Canone_Mensile, Canone_Annuale, Data_Stipula, Inizio_Locazione, Prima_Scadenza, Successive_Scadenze, Data_Aggiornamento_Canone) VALUES('908745', 'tipo_contratto', '3', 'Sono Cron', 'Contratto di prova inserito dal modulo miohookmodule CONTRLLARE QUESTO MODULO PER ELIMINARE QUESTA QUERY!!!!', '2003-08-10', 'IV', '4000', '90000', '2009-06-28', '2009-07-01', '2010-01-07', '2017-01-07', '2010-01-07')";
 
mysql_query($query2, $db);
    
mysql_close($db);
 
// Aggiorno la variabile che registra l'esecuzione
   
variable_set('miohookmodule_ultimocron', time());
  }
}
?>

Ho risolto. c'era un errore nel mio codice, praticamente non entrava mai nell'if(date....) per problemi di formato della data. sostituendo date con time() funziona tutto.

Praticamente ho sostituito questo

if (date('Y-m-d') > date('Y-m-d', $last_run))

con questo
  if (time() >  $last_run)

e funziona tutto

Sì, ma così l'IF è perfettamente inutile. Stai facendo un controllo per verificare che l'attuale esecuzione del cron stia avvenendo in data seguente all'esecuzione precedente. Se non vivi in un continuum temporale diverso dal nostro, questa condizione sarà sempre vera!
A me il codice con il formato data funzionava. Ovviamente funzionava una volta al giorno solamente, perché quello è il senso della condizione.

uesto tuo codice ha un pò di roba inutile:

<?php
include_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
drupal_cron_run();
/**
* Implementazione di hook_help()
*/
function miohookmodule_help($section, $arg)
{
    switch(
$section)
    {
        case
'admin/help#testblock':
            return
'mioHookModule riguarda la notifica di scadenze dei contratti';
    }
}
function
miohookmodule_cron()
{
   
// variabile di sistema: definisce quando è stato eseguita l'ultima operazione
 
$last_run = variable_get('miohookmodule_ultimocron', 0);
 
// controllo se il giorno attuale è maggiore del giorno dell'ultima esecuzione
 
if (date('Y-m-d') > date('Y-m-d', $last_run))
  {
   
$host=localhost;
   
$user_query=*****;
   
$pass="******";
   
$database=********;
   
$db = mysql_connect($host,$user_query,$pass);
    if (
$db == FALSE) echo "Errore nella connessione";
   
mysql_select_db($database, $db);
   
$query2="INSERT into Contratto (Numero, Tipo, Locatore, Conduttore, Dati_Immobile, Data_ERCL, Serie_ERCL, Canone_Mensile, Canone_Annuale, Data_Stipula, Inizio_Locazione, Prima_Scadenza, Successive_Scadenze, Data_Aggiornamento_Canone) VALUES('908745', 'tipo_contratto', '3', 'Sono Cron', 'Contratto di prova inserito dal modulo miohookmodule CONTRLLARE QUESTO MODULO PER ELIMINARE QUESTA QUERY!!!!', '2003-08-10', 'IV', '4000', '90000', '2009-06-28', '2009-07-01', '2010-01-07', '2017-01-07', '2010-01-07')";
 
mysql_query($query2, $db);
    
mysql_close($db);
 
// Aggiorno la variabile che registra l'esecuzione
   
variable_set('miohookmodule_ultimocron', time());
  }
}
?>

così dovrebbe essere un pò più pulito:
<?php
/**
 * Implementazione di hook_help()
 */
function miohookmodule_help($section, $arg){
    switch(
$section) {
        case
'admin/help#testblock':
            return
'mioHookModule riguarda la notifica di scadenze dei contratti';
    }
}
function
miohookmodule_cron() {
 
// variabile di sistema: definisce quando è stato eseguita l'ultima operazione
 
$last_run = variable_get('miohookmodule_ultimocron', 0);
 
// controllo se il giorno attuale è maggiore del giorno dell'ultima esecuzione
 
if (TRUE/* Sistema la condizione! */) {
   
$query2="INSERT into Contratto (Numero, Tipo, Locatore, Conduttore, Dati_Immobile, Data_ERCL, Serie_ERCL, Canone_Mensile, Canone_Annuale, Data_Stipula, Inizio_Locazione, Prima_Scadenza, Successive_Scadenze, Data_Aggiornamento_Canone) VALUES('908745', 'tipo_contratto', '3', 'Sono Cron', 'Contratto di prova inserito dal modulo miohookmodule CONTRLLARE QUESTO MODULO PER ELIMINARE QUESTA QUERY!!!!', '2003-08-10', 'IV', '4000', '90000', '2009-06-28', '2009-07-01', '2010-01-07', '2017-01-07', '2010-01-07')";
   
// Sta query non va assolutamente bene, ma è di test e quindi ok...
   
db_query($query2);
   
// Aggiorno la variabile che registra l'esecuzione
   
variable_set('miohookmodule_ultimocron', time());
  }
}
?>

Ciao
Marco
--
My blog
Working at @agavee