En pleine préparation de la version 2 de bloginy, je me suis mis à chercher la meilleure manière de faire des tâches cron avec symfony (des scripts qui s’exécutent périodiquement). La solution qui me convenait le plus était d’utiliser les tâches Symfony.

Les tâches Symfony
Vous savez, c’est toutes ces commandes qu’on lance à partir du terminal avec un namespace et un nom de tâche pour initialiser un projet par exemple ou construire le modèle de données (./symfony propel:build-model) ou toute autre commande.
Création de la tâche
Eh bain symfony nous permet de créer des tâches personnalisés à l’aide de la commande
./symfony generate:task monnamespace:matache
un fichier PHP est donc créé dans le dossier ‘lib/task’ de votre projet, que vous pouvez personnaliser très aisément, puisque vous pouvez accéder directement aux classes du model.
addArguments(array(
// new sfCommandArgument('my_arg', sfCommandArgument::REQUIRED, 'My argument'),
// ));
$this->addOptions(array(
new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'The application name'),
new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'dev'),
new sfCommandOption('connection', null, sfCommandOption::PARAMETER_REQUIRED, 'The connection name', 'propel'),
// add your own options here
));
$this->namespace = 'monnamespace';
$this->name = 'matache';
$this->briefDescription = '';
$this->detailedDescription = <<configuration);
$connection = $databaseManager->getDatabase($options['connection'] ? $options['connection'] : null)->getConnection();
// add your code here
}
}
Vous pouvez personnalisez ce fichier pour donner un titre et une description à cette tâche.
Une fois votre tâche créée et personnalisée, il ne vous reste plus qu’à créer la tâche CRON qui appelle cette tâche avec la commande suivante : ./symfony monnamespace:matache
Exemple d’une tache :
Voici un exemple de tâche que j’ai créé pour Bloginy.
class bloginyUpdateblogsfeedsTask extends sfBaseTask
{
protected function configure()
{
// // add your own arguments here
// $this->addArguments(array(
// new sfCommandArgument('my_arg', sfCommandArgument::REQUIRED, 'My argument'),
// ));
$this->addOptions(array(
new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'The application name'),
new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'dev'),
new sfCommandOption('connection', null, sfCommandOption::PARAMETER_REQUIRED, 'The connection name', 'propel'),
// add your own options here
));
$this->namespace = 'bloginy';
$this->name = 'update-blogs-feeds';
$this->briefDescription = 'Met à jour les flux des blogs inscrits sur Bloginy';
$this->detailedDescription = <<configuration);
$connection = $databaseManager->getDatabase($options['connection'] ? $options['connection'] : null)->getConnection();
// add your code here
$count = BlogPeer::updateBlogFeeds();
printf('%s articles ont été ajoutés à Bloginy.',$count);
}
}
Vous pouvez voir ici que tout le fonctionnement de cette tâche est effectué dans la classe du modèle « BlogPeer ».
Voilà j’espère que ça pourra aider plus d’un ![]()
Pingback: Youknowriad sur Blogasty
Pingback: Djafar Inal (inalgnu) 's status on Monday, 13-Jul-09 22:13:15 UTC - Identi.ca
Heu, bonjour!
Tu parles bien de la création des tâches, mais comment les mettre dans cron, ou crontab pour justement automatiser leur exécution?
@Morpheus972 pour ajouter ta tâche à crontab, tu le fais le plus normalement comme toute commande à ajouter au cron (un petit lien http://www.debianaddict.org/article62.html ) en mettant commen nom de commande : php symfony monnamespace:matache
@youknowriad
Navré… Il s’avère que pour exécuter une tache il faut être dans le dossier du projet… après cela dépend aussi de la manière dont symfony est installé.
@Morpheus972 oui c’est vrai, je suis désolé mais je pensais que c t évident pour le dossier du projet, mais normalement qq soit la manière dont a été installé symfony, tu pourra toujours l’éxécuter avec php symfony