In order to automate tasks that should run on a regular basis, you will need a cronjob. Fortunately, creating cronjobs with symfony is a piece of cake.

First, you will need to create a batch task. Navigate to your project directory and enter

symfony generate:task [your task] 

This will generate a task skeleton for you in lib/task/[your task]Task.class.php , which contains two important methods:* configure()* and execute(). The names are pretty self-explanatory. All your code should go in the execute() method. You might want to do some configurations first. Change the following lines in configure() accordingly:

$this->namespace        = 'project';
$this->name             = '[name-for-your-task]';
$this->briefDescription = '[some short explanation of what your task does]';

Before you start hacking your code into the execute() method, I would recommend to test-run it in a normal symfony module first. When you’re done, copy&paste the action of your test module into the execute() method. Be aware that tasks don’t contain a view and, therefore, you will need to *echo *any output directly in the method itself. An example that, frankly speaking, does nothing useful at all:

protected function execute($arguments = array(), $options = array())
{
 // initialize the database connection
 $databaseManager = new sfDatabaseManager($this->configuration);
 $connection = $databaseManager->getDatabase($options['connection'] ? $options['connection'] : null)->getConnection();

 // add your code here

 echo "I just did nothing at all, but at least I did it successfully!\n\n";
}

Let’s give it a test run. Open your command line and enter

symfony project:[your task]

If you see the expected output, you’re ready to go to the next step.

Please notice: The paths I’ve used apply to OpenSuse 11.1. If you run another Linux distribution, you might have to amend them.

Open your servers crontab at /etc/crontab in your favourite text editor and add the following line to the end of the document:

*/5 * * * * cd [YOUR SF APP DIR] && /usr/bin/symfony project:[YOUR TASK] >>[YOUR SF APP DIR]/log/crontab.log

Update: Thanks to Marcell Fülöp for the suggestion to use » to avoid overriding existing log entries

Explaining every detail of cronjobs would definitely blow the extent of this how-to and there are some very good sites out there that can help you understand. Just a quick explanation: This task runs every 5 minutes, changes to your symfony application directory, executes your task (please note that you don’t have access to your $PATH variables, so no symfony shortcut!) and outputs the result to /log/crontab.log .