Programación Avanzada

Crear archivos batch en symfony

por tryke en Dic.17, 2008, dentro Symfony

Crear archivos batch con symfony considero que es una de las tareas menos documentadas dentro del framework.

En este post veremos un ejemplo de como hacer un proceso batch para enviar un mailing a todos los usuarios con nuestro boletin.

En primer lugar ejecutaremos el comando init-batch de symfony para que cree el archivo batch.

  1. symfony init-batch default [yourBatchName] [yourApplicationName]

El comando crea automaticamente un archivo en el directorio batch de nuestro proyecto.

  1. <?php
  2.  
  3. /**
  4.  * yourBatchName batch script
  5.  *
  6.  * Here goes a brief description of the purpose of the batch script
  7.  *
  8.  * @package    yourProject
  9.  * @subpackage batch
  10.  * @version    $Id$
  11.  */
  12.  
  13. define('SF_ROOT_DIR',    realpath(dirname(__file__).'/..'));
  14. define('SF_APP',         'yourApplicationName');
  15. define('SF_ENVIRONMENT', 'dev');
  16. define('SF_DEBUG',       1);
  17.  
  18. require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
  19.  
  20. // initialize database manager
  21. //$databaseManager = new sfDatabaseManager();
  22. //$databaseManager->initialize();
  23.  
  24. // batch process here
  25. ?>

Como podemos observar por defecto te crea un comentario con las llamadas necesarias para inicializar nuestro acceso a la base de datos.

En primer lugar deberemos crearnos un modulo para el envio de emails, a este modulo nosotros lo hemos llamado “email” y la acción “boletin” es la encargada de realizar el envio. En la acción de este modulo leeremos el parametro “usuario_id” que será el que identifica el usuario receptor del mensaje.

actions.class.php

  1. <?php
  2. class emailActions extends sfActions
  3. {
  4.   public function executeBoletin()
  5.   {
  6.    $this->i18n = $this->getContext()->getI18N();
  7.    $this->usuario = UsuarioPeer::retrieveByPK($this->getRequestParameter('usuario_id'));
  8.    if (!$this->usuario) {
  9.       return sfView::NONE;
  10.    }
  11.    if (!$this->usuario->getMailavisos()) {
  12.       return sfView::NONE;
  13.    }
  14.    $this->i18n->setCulture($this->usuario->getCulture());
  15.  
  16.    $this->mail = new sfMail();
  17.    $this->setMailer('sendmail');
  18.    $this->setCharset('utf-8');
  19.    $this->setContentType('text/html');
  20.  
  21.    $this->mail->setSender('no-reply@miweb.com', 'miweb.com');
  22.    $this->mail->setFrom('no-reply@miweb.com', 'miweb.com');
  23.    $this->mail->addAddress($this->usuario->getEmail());
  24.    $this->mail->setSubject($this->i18n->__('Boletin semanal', null, 'email'));
  25.   }
  26. }
  27. ?>

Por otro lado montamos el template que será el que contiene el cuerpo del mensaje con el boletin a enviar.

boletinSuccess.php

  1. <?php echo sprintf('%s <b>%s</b>', __('Hola', null, 'email'), $usuario->getNombre() ); ?><br>
  2. <?php echo __('Este es tu boletin semanal', null, 'email') ?>

Para finalizar solo tenemos que retocar el fichero batch que hemos creado anteriormente para que lea de la base de datos todos los usuarios y vaya enviando el boletin.

batch_boletin.php

  1. <?php
  2. /**
  3.  * yourBatchName batch script
  4.  *
  5.  * Here goes a brief description of the purpose of the batch script
  6.  *
  7.  * @package    yourProject
  8.  * @subpackage batch
  9.  * @version    $Id$
  10.  */
  11. set_time_limit(0);
  12.  
  13. define('SF_ROOT_DIR',    realpath(dirname(__file__).'/..'));
  14. define('SF_APP',         'yourApplicationName');
  15. define('SF_ENVIRONMENT', 'dev');
  16. define('SF_DEBUG',       1);
  17. define('SF_LOG_DEBUG',   'crit');
  18.  
  19. require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');
  20.  
  21. // initialize database manager
  22. $databaseManager = new sfDatabaseManager();
  23. $databaseManager->initialize();
  24.  
  25. // batch process here
  26. sfLogger::getInstance()->log('Inicio envio boletin (' . date('Y-m-d H:m:i') . ')…', SF_LOG_DEBUG);
  27.  
  28. $c = new Criteria();
  29. $usuarios = UsuarioPeer::doSelect($c);
  30.  
  31. foreach ($usuarios as $s) {
  32.  sfContext::getInstance()->getRequest()->setParameter('usuario_id', $s->getId()); //Pasa el usuario por parametro
  33.  sfContext::getInstance()->getController()->sendEmail('email', 'boletin'); //Envia el email al usuario
  34.  sfLogger::getInstance()->log('envio boletin: ' . $s->getId(), SF_LOG_DEBUG); //Añado una linea en el log
  35.  sleep(rand(0,4)); //Espera un máximo de 4s por envio para evitar ser catalogado como spam
  36. }
  37.  
  38. sfLogger::getInstance()->log('Fin envio boletin (' . date('Y-m-d H:m:i') . ')…', SF_LOG_DEBUG);
  39. ?>

Si quisieramos podriamos poner nuestro archivo batch_boletin en el cron del servidor para que se ejecutará semanalmente.

:batch, Symfony
No hay comentarios para enta entrada...

Responder

Necesitas estar loginado para hacer un comentario.

¿Buscas Algo?

Usa este formulario para buscar en el blog:

¿No encuentras lo que estas buscado? Si quieres borrar un comentario de un post contacta con nosotros, podemos ayudarte!

¡Visita nuestros amigos!

Listado de webs recomendadas...

Archivos

Todas las entradas, cronologicamente...