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://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
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
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. –
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