Créer une tâche CRON sous Symfony

10 Janvier 2017 à 12:30 Programmation

Je ne publierai plus rien sur ce blog. Un nouveau blog existe maintenant. Il se nomme Hardly Smart.

Vous pourrez y retrouver des astuces plus larges sur l'informatique ainsi que mes anciens billets de blog.

Je vous souhaite une bonne lecture sur Hardly Smart.


Je me suis enfin plongé dans Symfony pour des besoins professionnels et j'ai été confronté au fait de devoir exécuter une tâche CRON sur un site Symfony. Alors oui créer un CRON n'est pas dur mais pouvoir réutiliser la logique et surtout la puissance de Symfony n'est pas forcément facile à faire si on doit charger composants après composants.

Il y a toujours la possibilité de créer des routes et d'appeler les URL dans le CRON mais comme Symfony intègre une console, pourquoi ne pas s'en servir justement. Voici donc comment en quelques lignes on peut réaliser une tâche CRON

<?php

    namespace BaBeuloula\TestBundle\Command;

    use Symfony\Component\Console\Command\Command;
    use Symfony\Component\Console\Input\InputArgument;
    use Symfony\Component\Console\Input\InputInterface;
    use Symfony\Component\Console\Output\OutputInterface;

    class TestCommand extends Command {

        protected function configure () {
            // On set le nom de la commande
            $this->setName('app:test');

            // On set la description
            $this->setDescription("Permet juste de faire un test dans la console");

            // On set l'aide
            $this->setHelp("Je serai affiche si on lance la commande app/console app:test -h");

            // On prépare les arguments
            $this->addArgument('name', InputArgument::REQUIRED, "Quel est ton prenom ?")
                 ->addArgument('last_name', InputArgument::OPTIONAL, "Quel est ton nom ?");
        }

        public function execute (InputInterface $input, OutputInterface $output) {
            $text = 'Hi '.$input->getArgument('name');

            $lastName = $input->getArgument('last_name');
            if ($lastName) {
                $text .= ' '.$lastName;
            }

            $output->writeln($text.'!');
        }
    }

Et maintenant si j'exécute la commande php app/console app:test Jérémy

$ php app\console app:test Jeremy
Hi Jeremy!

$ php app\console app:test Jeremy Test
Hi Jeremy Test!

Vous pouvez aussi récupérer des options si besoin

$this
    // ...
    ->addOption(
        'iterations',
        null,
        InputOption::VALUE_REQUIRED,
        'How many times should the message be printed?',
        1
    );

Et vous pouvez aller récupérer l'option via $input->getOption('iterations').

L'ordre de vos options n'a d'importance, par contre l'ordre des paramètres est important lui.

Si vous avez besoin de charger le container dans votre commande, remplacez extends Command par extand ContainerAwareCommand avec le use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand. Vous pouvez maintenant charger le container avec

$this->getContainer();

Et du coup, vous pouvez récupérer Doctrine via son service

$this->getContainer()->get('doctrine')->getManager();

Voilà comment en quelques lignes vous avez créé une nouvelle commande pour la console Symfony et maintenant il ne vous reste plus qu'à l'insérer dans votre crontab.

Source

Documentation Symfony sur l'utilisation de la console

Articles liés

Les commentaires ont été désactivés.

9 commentaires

Razbounak 4 Février 2017 à 09:42

C'est bien mais je ne vois pas où est-ce que tu créé une tâche cron....

BaBeuloula 4 Février 2017 à 09:56

Salut Razbounak,

Les tâches CRON se font au sein même de Linux via la commande "crontab -e" en étant en root si possible. Je ne l'avais pas écrit car pour moi cela était implicite.

Kim 30 Janvier 2018 à 22:10

Bonjour j'ai suivi votre conseil et ça marche bien pour moi sauf que je n'arrive pas recuperer les entités ex: $item-getId()

BaBeuloula 31 Janvier 2018 à 09:17

Salut,
Est-ce que tu peux mettre ton code sur https://hastebin.com/ ou https://gist.github.com/ ? Cela serai plus simple.

Petite remarque, dans ce que tu mets tu as oublié la flèche $item->getId(), n'est-ce pas simplement cela ton problème ?

Kim 31 Janvier 2018 à 21:14

Merci j’ai resolu le problème c’est L’IDE qui créerait l’embrouille apparement j’ai exécuté la tâche et ça marche encore merci pour le tutoriel

BaBeuloula 31 Janvier 2018 à 21:19

Salut, bon tant mieux si ce n'est que ça.

Riusma 17 Juin 2019 à 10:31

Salut,
comment faire pour créer un cron-job qui s'exécute automatiquement a un intervalle régulier?

Merci d'avance

BaBeuloula 17 Juin 2019 à 10:44

Salut Riusma,

Je t'invite à regarder comment fonctionne le crontab. Après pour savoir ce que tu dois écrire dedans tu peux regarder des générateurs via des sites comme celui là https://crontab-generator.org/

nizardinho 24 Février 2021 à 11:33

Merci ! très utile !