mybuilder / cronos-bundle
Symfony 4/5/6 bundle which allows you to use @Cron annotations to configure cron to run your console commands.
Installs: 394 271
Dependents: 1
Suggesters: 0
Security: 0
Stars: 89
Watchers: 14
Forks: 15
Open Issues: 12
Type:symfony-bundle
Requires
- php: >=8.0.2
- doctrine/annotations: ^1.11
- mybuilder/cronos: ^3.0 || ^4.0
- symfony/config: ^4.4.20 || ^5.4 || ^6.0
- symfony/console: ^4.4.20 || ^5.4 || ^6.0
- symfony/dependency-injection: ^4.4.20 || ^5.4 || ^6.0
- symfony/framework-bundle: ^4.4.20 || ^5.4 || ^6.0
- symfony/http-kernel: ^4.4.20 || ^5.4 || ^6.0
- symfony/property-access: ^4.4.20 || ^5.4 || ^6.0
- symfony/yaml: ^4.4.20 || ^5.4 || ^6.0
Requires (Dev)
- phpunit/phpunit: ^9.5.27
README
A bundle for Symfony 4/5/6 that allows you to use @Cron
annotations to configure when cron should run your console commands.
Uses the Cronos library to do the actual output and updating.
Installation
Install with composer
Run the composer require command:
$ composer require mybuilder/cronos-bundle
Enable the bundle
If you do not use Symfony Flex, enable the bundle in the config/bundles.php
for Symfony 4/5/6:
return [ MyBuilder\Bundle\CronosBundle\MyBuilderCronosBundle::class => ['all' => true], ];
Configure the bundle
You can add the following to your config/packages/my_builder_cronos.yaml
(Symfony 4/5/6) to configure the package.
my_builder_cronos: exporter: key: unique-key mailto: cron@example.com path: /bin:/usr/local/bin executor: php console: bin/console shell: /bin/bash
Usage
The first step is to add the use case for the annotation to the top of the command you want to use the @Cron annotations in.
use MyBuilder\Bundle\CronosBundle\Annotation\Cron;
Then add to the phpdoc for the command class the '@Cron' annotation which tells cron when you want it to run. This example says it should be run on the web server, every 5 minutes, and we don't want to log any output.
/** * Command for sending our email messages from the database. * * @Cron(minute="/5", noLogs=true, server="web") */ class SendQueuedEmailsCommand extends Command {}
Specifying when to run
The whole point of cron is being able to specify when a script is run therefore there are a lot of options.
You should read the general cron info for a general idea of cron and what you can use in these time fields.
Please note You CANNOT use */
in the annotations, if you want */5
just put /5
and Cronos will automatically change it to */5
.
Annotation examples
Building the cron
You should run bin/console cronos:dump
and review what the cron file would look after it has been updated.
If everything looks ok you can replace your crontab by running the command below.
bin/console cronos:replace
You can also limit which commands are included in the cron file by specifying a server, and it will then only show commands which are specified for that server.
Exporting the cron
bin/console cronos:dump --server=web
bin/console cronos:replace --server=web
Environment
You can choose which environment you want to run the commands in cron under like this.
bin/console cronos:replace --server=web --env=prod
Troubleshooting
- When a cron line is executed it is executed with the user that owns the crontab, but it will not execute any of the users default shell files so all paths etc need to be specified in the command called from the cron line.
- Your crontab will not be executed if you do not have usable shell in
/etc/passwd
- If your jobs don't seem to be running check the cron daemon is running, also check your username is in
/etc/cron.allow
and not in/etc/cron.deny
. - Environmental substitutions do not work, you cannot use things like
$PATH
,$HOME
, or~/sbin
.
Created by MyBuilder - Check out our blog for more insight into this and other open-source projects we release.