2012-06-29 15 views
6

Ho iniziato a utilizzare CakePHP (1.2) alcuni mesi fa per aggiungere piccole funzionalità all'applicazione dell'azienda e non ho molta familiarità con esso.Lavoro cron di Cakephp per chiamare l'azione di un controller

Testiamo localmente quindi su un server di sviluppo prima di unire ad un server di produzione.

Desidero che un'azione del controller venga chiamata ogni ora con quello che ho ritenuto essere il modo migliore per farlo attraverso le mie ricerche, un lavoro cron.


Tentativo 1

Dopo aver letto questi,

http://bakery.cakephp.org/articles/mathew_attlee/2006/12/05/calling-controller-actions-from-cron-and-the-command-line

http://book.cakephp.org/1.2/en/view/110/Creating-Shells-Tasks

ho potuto realizzare qualcosa senza errori, ma non viene eseguita l'azione.

Sulla base di questi esempi, ho aggiunto un file chiamato cron_dispatcher.php nella mia cartella app (non app/webroot) e poi ha fatto questo comando dalla app dir

php cron_dispatcher.php/regolatore/azione/param

Ancora non è successo nulla ma funziona perfettamente quando lo chiamo tramite l'url.


Tentativo 2

Ho cercato di creare un guscio (email.php), che chiamerà l'azione in/app/fornitori/shells /.

<?php 

class EmailShell extends Shell { 

    public function main() { 
     $this->out('Test'); 
    } 

} 
?> 

Emette con successo di test nella console utilizzando la posta elettronica

torta principale

ma poi non riesco a trovare il modo di chiamare l'azione del controller. Ho provato

$ this-> requestAction ('/ controller/action');

Ho anche provato a effettuare la chiamata da una funzione diversa da quella principale nella shell.

ho cercato di includere il controller nella $ utilizza variabili come farei con un modello, ma che non ha funzionato (e non ha senso credo)

Non credo che la creazione di un compito è la soluzione sia perché non voglio duplicare la funzione sendEmails, quindi perché sto cercando un modo per chiamare l'azione del controller da una shell o qualsiasi altra cosa!

C'è probabilmente qualche teoria che mi manca, grazie


Soluzione

ho spostato alcuni metodi dal controller a un modello e sono stato in grado di chiamare da una conchiglia.

App::import('Component', 'Email'); 

class SendMemosShell extends Shell { 

    var $uses = array(
     'Memo', 
    ); 

    public function main() { 

    } 

    public function sendEmails() { 
     $this->Email =& new EmailComponent(null); 
     $memoList = $this->Memo->getMemos(); 
     //... 
    } 
} 

Questo link aiutato http://book.cakephp.org/2.0/en/console-and-shells/cron-jobs.html


edit: ha chiarito alcune delle informazioni e ha aggiunto la soluzione

risposta

3

è un problema abbastanza comune in realtà, ha incontrato anche.

Un controller sta decidendo come gestire una richiesta e avviare tale attività. In questo caso non è necessario un controller poiché si dispone di un'attività shell, l'attività è già chiara.

Sapendo che non ha senso chiamare un metodo di controllo.

Quindi rivedete le vostre opzioni, e sì questo è piuttosto difficile. Ad esempio, potresti decidere che l'invio dell'e-mail è un passaggio della logica aziendale, quindi dovrebbe essere nel modello. Un'altra opzione è separarla totalmente (questo è ciò che ci piace di più).

In tal caso sarà necessario creare una coda in cui inserire tutte le e-mail da inviare. Si tratta di un buon design poiché si conosce la quantità di logica nel controller che scende e viene separata. In questo modo si ottiene un servizio di posta elettronica.

Ad esempio, è possibile chiedere al servizio di inviare una posta "nuovo utente". Quindi si aggiunge l'oggetto Utente e dovrebbe gestirsi da solo. In questo modo si può anche scalare in quanto il servizio potrebbe essere, per esempio in outsourcing, è possibile espandere più server sul servizio ecc

Modifica:

buone domande.

passaggi per prendere:

  1. centralizzare il processo di "invio di e-mail" per primo. Quindi scegli un luogo dove metterlo. Puoi decidere: Aggiungi per inviare e-mail a una coda o chiamare direttamente il servizio. Ad esempio è possibile aggiungere un'attività di shell per l'invio delle e-mail.

  2. Chiama la shell: ora hai il problema di chiamare la shell. In generale non vuoi. Perchè no? Perché una shell (un'attività) potrebbe funzionare per molto tempo. Ecco perché usiamo le code in mezzo. Quindi puoi chiedere alla coda o lasciare che la coda ti avvisi che qualcosa è fatto. Ad esempio, pensa a un server di posta che non funziona. Devi riprovare ecc. Non dovrebbe essere in una richiesta web perché l'utente è in attesa di risposta.

  3. Terzo passo è chiamare la shell dal cron, ora è facile poiché si è già sulla riga di comando in modo da poter utilizzare le chiamate standard.

In ogni caso, ci sono opzioni per effettuare una chiamata diretta da un controller ma non si dovrebbe.Questo post fornisce alcuni spunti molto interessanti: CakePHP: Run shell job from controller

Modifica 31/08/'13: vedere il sistema di eventi CakePHP anche per alcuni esempi: http://book.cakephp.org/2.0/en/core-libraries/events.html

+0

Devo essere in grado di chiamare manualmente questa azione (facendo clic su un pulsante nella vista, ad esempio). Suggerisco di creare un'attività anziché un'azione del controllore e chiamarla invece (automaticamente con un cron job e manualmente al click)? Una shell è qualcosa che chiami totalmente separato dalla logica o stavi parlando della coda? A volte ho bisogno di inviare più e-mail contemporaneamente (quando viene controllato automaticamente) ma non dovrebbe accadere troppo spesso quindi mi chiedo se la coda è un po 'troppo complessa per le mie esigenze! Grazie per la risposta – Catherine

+0

Rispondili anche a te, in generale, dovresti pensare alle dimensioni della tua app e al suo design. Il modo in cui ho risposto alla tua domanda è uno dei modi in cui dovrebbe essere fatto. Non significa che sia il modo migliore per gli affari. Se si invia una mail a volte, non vale la pena di creare una configurazione completa e più complessa. –

+1

Ciao di nuovo, grazie per la tua risposta dettagliata. Abbiamo convenuto che non era necessario inviare e-mail manualmente, quindi ho creato una shell che invia le e-mail. Mi ha anche costretto a spostare più metodi dal controller al modello che è più appropriato se ho capito bene. Ho quindi seguito questa procedura per impostare il lavoro cron: http://book.cakephp.org/2.0/en/console-and-shells/cron-jobs.html ho deciso di non usare le code anche se questo mi sembrava interessante perché non valeva la pena in questo caso! – Catherine

0

A seconda di ciò che deve essere fatto, ho spesso tenere questi metodi nelle azioni del mio controller. Nella parte superiore dell'azione, controllo $ _SERVER ['REMOTE_ADDR'] == $ _SERVER ['SERVER_ADDR'] per verificare che solo il sito Web possa chiamare l'azione. Poi in cron mi piacerebbe arricciare o wget questo indirizzo.

Ha i suoi vantaggi - più facile da eseguire localmente durante lo sviluppo (basta inserire l'url nel browser), inoltre ci sono alcune differenze tra la versione cli in esecuzione della versione php e apache, così come le variabili di richiesta (es. non è possibile ottenere il dominio/indirizzo del sito web tramite cli come se fosse possibile eseguire come modulo apache, quindi i collegamenti assoluti al sito Web con l'helper html non funzionano).

+0

Ho provato solo a wget l'indirizzo e non sembra aver eseguito l'azione come volevo, probabilmente ho sbagliato. Non ho provato a inserirlo nel crontab, suppongo che dovrei fare ulteriori esperimenti su questo in futuro. Grazie e scusa non posso valutarti sono ancora nuovo al sito. – Catherine

Problemi correlati