info@appassionate.es
655 600 161
FreeGreatPicture.com-30739-stock-photo-770x340

Lanzar un proceso en background con symfony 2.1

A continuación comento como realizar un proceso background desde symfony 2.1 desde la línea de comando. Encontré información en la web pero no demasiado exacta. Puedes echar un vistazo a la información oficial

Lo primero que hice fué crear un bundle de utilidades y creé un directorio ‘Command’ (había leido que era obligatorio crear éste directorio y meter nuestro script dentro de el también con el sufijo Command). No lo he comprobado.

Mi proceso enviaba justificantes de preinscripciones en pdf y el tiempo en generarlos era bastante largo para crear todos los archivos y envíarlos, así que hice éste código que lanza un proceso en background.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
//EnviarJustificanteCommand.php
namespace Backend\AdminUtilBundle\Command;
 
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Doctrine\ORM\EntityManager;
 
class EnviarJustificanteCommand extends <strong>ContainerAwareCommand</strong> {
    protected function configure()
    {
        $this
            ->setName('enviar:justicantes')
            ->setDescription('description')
        ;
    }
 
    protected function execute(InputInterface $input, OutputInterface $output)
    {   
        //get entity manager for queries
        $em = $this->getContainer()->get('doctrine')->getEntityManager();
 
        //script code
    }
}

Una cuestión importante es que en la documentación dice que se extienda de clase Command, pero si extendemos de la clase ContainerAwareCommand podremos obtener el $em (entity manager) para realizar consultas.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// EnvioJustificantes.php
namespace Backend\AdminUtilBundle\Command;
 
require_once '../../../../vendor/autoload.php';
 
use Backend\AdminUtilBundle\Command\EnviarJustificanteCommand;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Tester\CommandTester;
 
$application = new Application();
$application->add(new EnviarJustificanteCommand);
$application->start(); //lanza el proceso en background

Ahora solo queda probarlo desde la linea de comando de ésta manera:

1
$php app/console enviar:justificantes

e imagino que te interesará programarlo con cron para que se ejecute cada cierto tiempo.

Espero que te haya sido de utilidad.

Introducir Comentario

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>