PDA

Visualizza versione completa : Eseguire in automatico script PHP


Alhazred
26-03-2009, 21.09.00
Sto scrivendo un'applicazione in PHP per un sito, c'è una tabella nel db che mantiene traccia di alcuni appuntamenti ai quali ci si può prenotare.

Bene, dovrei scrivere una funzione, da eseguire una volta al giorno, che acceda a tale tabella e cancelli gli appuntamenti scaduti. Semplice da realizzare una pagina che faccia una cosa simile, ma vorrei non dover accedere manualmente una volta al giorno a tale pagina.

Ho chiesto all'hoster se è possibile utilizzare Cronotab che mi risolverebbe il problema, la riposta è stata: i cronojob sul profilo entry sono disabilitati, ma sono abilitati sul profilo professional. Quindi in teoria servirebbe un upgrade del profilo.

Secondo voi, dire che i cronojob sono disabilitati vuol dire che è disabilitata una loro interfaccia che mi permetterebbe di gestire queste cose, oppure che non funzionerebbe neanche un programma che installo io?
Non lo chiedo a loro perché di sicuro mi risponderebbero che non c'è altro modo se non passando al profilo professional, anche se ciò non fosse vero.

In caso sia effettivamente indispensabile passare al profilo professional per usare i cronojob, posso risolvere il mio problema in un modeo diverso?

UG0_BOSS
28-03-2009, 13.31.12
Forse il modo più semplice per farlo senza ricorrere ai cronjob è quello di eseguire la pulizia ad ogni accesso di qualsiasi utente, tenendone traccia tramite un file per evitare che venga ripetuta più di una volta.
Mi spiego meglio: ti crei una funzione, per esempio pulisci_tabella, che esegua la pulizia e tramite la funzione touch aggiorni la data di accesso ad un file che puoi chiamare a piacere (tipo last_cleanup).
Poi, nella pagina principale del programma aggiungi una linea di codice del tipo:

if(fileatime('last_cleanup') < (time() - 86400)) pulisci_tabella();

In questo modo la tabella viene pulita al massimo una volta ogni 24 ore (86.400 secondi) e non hai rallentamenti nello script se non i pochi millisecondi necessari ad accedere al file sull'hard disk.

Alhazred
28-03-2009, 14.30.48
Grazie, stavo pensando di far avviare le operazioni sul db appena qualcuno avesse visitato una determinata pagina, in particolare quella che dovrebbe mostrare i dati aggiornati, ma pensando che l'operazione sarebbe stata effettuata ripetutamente e dalla seconda in poi senza motivo pensavo di abbandonare l'idea.
Adesso che mi hai detto questa cosa però proverò a fare come dici tu :)

Alhazred
02-04-2009, 20.27.15
Ho provato la soluzione che mi hai proposto, ma ha un comportamento strano.
Il codice che ho usato è questo

if(fileatime("..".DS."accesso".DS."cleanup.txt") < (time() - 86400)) {
if(pulisci_prestazioni($db)) {
touch("..".DS."accesso".DS."cleanup.txt");
}
}

Mi loggo all'applicazione come amministratore, accedo alla pagina con questo codice e viene eseguita la funzione pulisci_prestazioni(), vado in un'altra pagina, dopo un po' torno su quella col codice e ok, la pulizia non viene eseguita.
Faccio il logout e mi riloggo con l'account di un utente, vado sulla pagina dell'utente in cui è presente questo codice e la funzione pulisci_prestazioni() viene eseguita di nuovo, anche se sono passati 2 minuti da quando è stato effettuato l'accesso al file dal codice presente sulla pagina dell'amministratore.

Sembra come se l'accesso dipenda da qualcosa legato alla sessione piuttosto che all'ora di accesso al file.
Dove può essere l'inghippo?

UG0_BOSS
04-04-2009, 12.56.40
Il codice sembra corretto. Prova a fare un po' di debug, per esempio controllando che la data di accesso del file venga effettivamente modificata

Alhazred
10-04-2009, 19.07.20
Mah, pare che stia funzionando a dovere.
Forse quando ho notato il problema avevo aperto il file senza pensarci ed è cambiato l'orario d'accesso facendomi credere che ad accedere fosse stata la funzione touch.