2009-05-14 13 views
10

Ho uno script php che legge un file tramite http (il file è su un altro dominio). Vorrei leggere questo file solo una o due volte al giorno, invece di collegarlo ad ogni volta che il sito viene aggiornato. C'è qualche altro modo di farlo con cron? Non voglio usare cron perché preferisco impostare questo comportamento nello script stesso .. quindi è flessibile, quindi posso usarlo ovunque senza configurare cron ogni volta. grazieCome posso eseguire script PHP in determinati intervalli (ad esempio una volta al giorno)?

risposta

7

Se non puoi o non vuoi usare usa cron ed è ok per aggiornarlo solo quando si accede alla pagina. È possibile memorizzare nella cache il risultato della richiesta HTTP e aggiornarlo solo su una pagina caricandola se la cache è più vecchia di un giorno o qualunque intervallo si scelga.

+0

grazie, finora sei l'unico a capire che cerco un modo diverso da cron. come faccio a fare questo cache? è APC cosa intendi? – Adriana

+0

APC è un modo per fornire una cache veloce in memoria, ma non l'unico modo. C'è memcached se si vuole essere in grado di distribuire la cache su più macchine. In alternativa, è sufficiente inserire una copia nel DB e non introdurre nuove tecnologie. –

+1

Il modo più semplice per memorizzare nella cache le cose dovrebbe essere l'uso delle funzioni di buffering dell'output di PHP. (http://www.php.net/manual/en/function.ob-start.php) – Alo

-1

Se siete su un ambiente * nix è possibile utilizzare cron jobs

1

È possibile utilizzare un Cronjob. È quindi possibile eseguire lo script php dalla riga di comando.

php /someplace/somefile.php 

Il Cronjob sarebbe il seguente se si aggiorna ogni giorno.

0 0 * 0 0 php /someplace/somefile.php 
3

È inoltre possibile utilizzare Web Based Cron se si vuole colpire un sito su un intervallo di tempo.

+0

sto usando cron basato sul web perché non ho potuto giustificare vpn sul mio pacchetto di hosting e sono molto soddisfatto.grazie per il puntatore –

-1

Cosa c'è di sbagliato con cron?

Avete un paio di scelte con cron - il vostro php può essere invocato dall'interprete PHP della riga di comando, oppure potete usare wget o fetch o l'equivalente per invocare il vostro PHP sul server.

In generale, PHP eseguito nel contesto del server Web ha un limite di tempo per quanto tempo può essere eseguito, quindi in generale non è possibile impostare thread PHP "in background" per fare cose "più tardi".

+1

Ha chiesto specificamente un'alternativa a Cron, questo è il motivo per cui ho downvoted questa risposta. – Veehmot

12

ho fatto questo genere di cose in passato, quando non ho avuto accesso a cron:

$lastRunLog = '/path/to/lastrun.log'; 
if (file_exists($lastRunLog)) { 
    $lastRun = file_get_contents($lastRunLog); 
    if (time() - $lastRun >= 86400) { 
     //its been more than a day so run our external file 
     $cron = file_get_contents('http://example.com/external/file.php'); 

     //update lastrun.log with current time 
     file_put_contents($lastRunLog, time()); 
    } 
} 
+0

questo è un modo intelligente, bello! Tuttavia, guarderò di più sulle funzioni di buffering poiché mi sembra migliore per quello di cui ho bisogno. – Adriana

+0

Ma devi eseguire il codice di cui sopra nell'intervallo giusto? Voglio dire che dovresti in qualche modo continuare a controllare la differenza tra l'ora corrente e lastRun. Come si fa senza cron? – user1512681

+0

È possibile che i visitatori del tuo sito lo eseguano o lo chiamino da un altro sistema con cui hai accesso a cron, ecc. – cOle2

1

Dal momento che si afferma esplicitamente che non si desidera utilizzare cron, l'unico altro modo per fare questo (senza qualcosa di analogo a cron) è quello di impostare il tuo script come un demone. Tuttavia, a meno che non si abbia realmente bisogno della flessibilità fornita dai demoni, cron è molto più semplice e semplice.

Ecco uno daemon walk-through.

2

Si potrebbe persino utilizzare una tabella di database, molto semplice per struttura, id, data, url di script e tutto ciò che è necessario, e aggiungere una riga ogni volta che si esegue lo script.

Quindi, prima di eseguire lo script, è sufficiente controllare i numeri di riga per ogni giorno che si dispone.

0

Se stai usando una distro Linux con systemd:

ho avuto la necessità di pianificazione dei processi su base annuale, indipendente dall'applicazione (nel caso in cui il sistema riavviato o qualcosa di simile), e mi hanno dato il suggerimento di utilizzare systemd Timers. L'Arch Wiki Page contiene alcuni esempi.

Problemi correlati