Domanda

Sto cercando di trovare un elenco di diversi approcci per eseguire attività pianificate su PHP. La mia intenzione è di fornire un modo universale per eseguire attività pianificate in PHP. Finora ho:

1) Analizza il traffico del sito. Se ricevi 770 hit al giorno (ovvero un hit ogni 2 minuti) e hai pianificato l'esecuzione di un'attività alle 6:00 AM e un visitatore ha richiesto una pagina alle 5:59 AM, esegui l'attività perché il visitatore successivo lo farà arriva in media alle 6:01. Run = exec ('/ usr / bin / php -f /home/account/cron.php') in questo caso.

(+) Funziona su tutte le piattaforme purché i percorsi siano corretti.

(-) Richiede un po 'di potenza della CPU.

(-) Richiede exec ().

(-) Non è preciso su siti più piccoli o su siti con enormi picchi di traffico.

2) Versione migliorata di quanto sopra. Quando l'utente richiede la pagina e l'attività deve essere eseguita, non utilizzare exec () ma include () dopo aver scaricato il contenuto per l'utente.

(+) Funziona su tutte le piattaforme.

(+) No exec () 's.

(-) Richiede un po 'di potenza della CPU.

(-) Non è preciso su siti più piccoli o su siti con enormi picchi di traffico.

3) Esecuzione di uno sfondo di processo separato in modo che sia in esecuzione in un ciclo costante. Fornisci un'interfaccia di amministrazione che ti consente di "iniziare" e "fine" il "servizio". Quindi utilizzerà fsockopen () per chiamare uno script .php che gira all'infinito. Usa sleep () per non consumare risorse e per svegliarsi quando è il momento (vedi: time_sleep_until ()). Potrebbe cercare file e leggerli per capire quando eseguire quali attività. Si potrebbe creare il file "run-everyday-3.00am" ciò rende lo scheduler in grado di eseguire il codice al suo interno.

(+) Funziona su tutte le piattaforme.

(+) No exec () 's.

(+) Può essere abbastanza preciso (ad es. se dorme al minuto).

(-) Non è stabile: un arresto anomalo del server arresta completamente lo scheduler.

(-) Ad alcuni host non piace avere un processo in esecuzione 24/7/365 = hog risorse?

4) Esegui exec ('crontab') direttamente su Linux e simili.

(+) Non è un porco di risorse.

(+) È preciso.

(-) exec ().

(-) Non funziona su tutte le piattaforme.

5) Richiesta di credenziali cPanel e creazione di un POST per creare / gestire / rimuovere croni.

(+) È preciso

(+) Non è un porco di risorse.

(-) Cattivo per la sicurezza

(-) Richiede i dettagli dell'utente = usabilità ridotta

(-) Non funziona su tutte le piattaforme (richiede cPanel che non funziona su Windows).

(-) Richiede cPanel.

Altre idee?

È stato utile?

Soluzione

Quasi tutti i metodi che hai suggerito sono brutti, anche se la maggior parte funzionerà.

La mia brutta alternativa è quella di impostare cron su un computer locale con connettività Internet che esegua un comando di arricciatura ogni pochi minuti.

È brutto come tutte le tue soluzioni, ma è leggermente più affidabile.

Altri suggerimenti

Uso uno strumento di Windows chiamato VisualCron per eseguire il ping di script protetti da password http su server remoti che eseguono attività specifiche. V-C ha anche delle belle notifiche sullo stato della posta elettronica.

Nota che questo è molto simile al post di Zack sull'uso di cron + curl locale o cron + wget

http://www.visualcron.com http://www.visualcron.com/img/screenshots/v5/ MainWindow / mainwindow_bluetheme.png

Hai mai usato l'utilità di pianificazione di Windows o a comando ? È possibile usarlo come alternativa a CRON su UNIX. È possibile (1) scrivere uno script PHP che esegue tutti i compiti necessari (2) impostare un lavoro CRON su UNIX o Attività pianificata su Windows per eseguire questo script tramite CLI PHP.

È anche possibile eseguire lo script aprendo da HTTP da una macchina remota. La macchina remota può essere una casella UNIX o Windows. wget può essere utilizzato al posto di un browser Web ed è disponibile per entrambe le piattaforme.

Vorrei optare per un secondo server / macchina virtuale per eseguire questi tipi di attività pianificate. Quel secondo server può essere offsite ed eseguire altre funzioni come avvisare l'utente quando il server primario non risponde, ecc.

A proposito, qual è la tua definizione di " accurato? "

IMHO, dovresti scrivere un livello sopra questi metodi ...

User code <=> [User interface]<-> Your library <->[Technology interface] <=> Technology execution module (method)

Quindi non devi implementare tutti i metodi, ma se tu o il tuo cliente avete bisogno di un nuovo metodo ... tutto quello che deve fare è implementare la vostra interfaccia tecnologica.

A proposito, il "metodo di esecuzione della tecnologia" può essere scritto come un modulo PHP per una migliore integrazione prestazioni / sistema host.

Se fossi in te, cercherei una libreria / modulo esistente e non creerei un processo in background a meno che il sistema sottostante non sia in grado di gestire le attività pianificate (unix e Windows non le gestiscono).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top