m-adamski / symfony-schedule-bundle
Schedule Bundle for Symfony
Installs: 34 103
Dependents: 0
Suggesters: 0
Security: 0
Stars: 14
Watchers: 0
Forks: 2
Open Issues: 0
Type:symfony-bundle
pkg:composer/m-adamski/symfony-schedule-bundle
Requires
- php: >=8.2
 - dragonmantank/cron-expression: ^3.3
 - symfony/console: ^7.0
 - symfony/framework-bundle: ^7.0
 - symfony/lock: ^7.0
 
README
Bundle for simplifying operations with CRON jobs.
Installation
This Bundle can be installed by Composer:
$ composer require m-adamski/symfony-schedule-bundle
How to use it?
Bundle provide functionality to manage CRON jobs by configuration from specified file.
We need to create class implementing Adamski\Symfony\ScheduleBundle\Model\ManagerInterface interface.
namespace App\Model;
use Adamski\Symfony\ScheduleBundle\Model\ManagerInterface;
use Adamski\Symfony\ScheduleBundle\Model\Schedule;
class ScheduleManager implements ManagerInterface {
    public function schedule(Schedule $schedule) {
        // TODO: ..
    }
}
Then we need to complete the configuration - create file config/packages/schedule.yaml and set path to ScheduleManager:
schedule:
    manager: App\Model\ScheduleManager
Command schedule configuration
In function schedule we can configure CRON jobs with required expressions.
For example we want run app:test-command daily at 12:00:
public function schedule(Schedule $schedule) {
    $schedule->command("app:test-command")->dailyAt("12:00");
}
Schedule class provide many date-time manipulators. This functionality is inspired by Laravel Tasks Scheduling.
Schedule Frequency Options
There are many schedules that you can assign to your task.
| Method | 
|---|
| cron($expression) | 
| everyMinute() | 
| everyFiveMinutes() | 
| cron($expression) | 
| everyMinute() | 
| everyFiveMinutes() | 
| everyTenMinutes() | 
| everyFifteenMinutes() | 
| everyThirtyMinutes() | 
| hourly() | 
| hourlyAt(int $offset) | 
| daily() | 
| at(string $time) | 
| dailyAt(string $time) | 
| twiceDaily(int $first = 1, int $second = 13) | 
| weekdays() | 
| weekends() | 
| mondays() | 
| tuesdays() | 
| wednesdays() | 
| thursdays() | 
| fridays() | 
| saturdays() | 
| sundays() | 
| weekly() | 
| weeklyOn(int $day, string $time = "0:0") | 
| monthly() | 
| monthlyOn(int $day = 1, string $time = "0:0") | 
| twiceMonthly(int $first = 1, int $second = 16) | 
| quarterly() | 
| yearly() | 
| days($days) | 
CRON
Now it's enough to insert only one entry into crontab on server:
* * * * * php /path-to-project/bin/console schedule:run >> schedule.log 2>&1
License
MIT