m-h-1 / cron-bundle
Requires
- php: ^7.1|^8.0
- doctrine/orm: ^2.6
- dragonmantank/cron-expression: ^3.1
- ramsey/uuid-doctrine: ^1.6
- symfony/console: ^5.1
- symfony/framework-bundle: ^5.1
- symfony/lock: ^5.1
- symfony/process: ^5.1
- symfony/yaml: ^5.1
Requires (Dev)
- jaschilz/php-coverage-badger: ^2.0
- phpstan/phpstan: ^0.12.86
- squizlabs/php_codesniffer: ^3.5
- symfony/phpunit-bridge: ^5.1
Conflicts
README
cron-bundle
Simple Symfony bundle to schedule commands. Uses symfony/lock to make sure a specific command can't run more than once at the same time. Different commands are executed in parallel.
目录
使用方法
注册新任务
只需在 mh1_cron_job
中创建一个新条目即可简单地注册一个新任务。
INSERT INTO mh1_cron_job (id, title, description, command, enabled, schedule, execute_stalled) VALUES ('d63a6a70-0b56-4b0d-bdfb-06e4c7e7a2eb', 'Symfony Help Command', 'display the Symfony help', 'help', 1, '*/15 * * * *', 1);
执行任务
$ bin/console mh1:cron:run
停滞的任务执行
这仅适用于过去至少运行过一次的任务!
Doctrine 集成还提供了执行停滞任务的可能性。
停滞的任务是指原本应该在特定时间执行但未能执行的任务,这可能是由于暂时禁用或未运行 bin/console mh1:cron:run
,但一旦任务再次启用,就应该运行。
例如,您有一个每天凌晨1点运行的任务,但由于某些原因(例如服务器维护),任务在凌晨0:30到3点之间没有执行。如果将 executeStalled
(《execute_stalled》数据库列)设置为 true,则任务将在维护窗口后凌晨3点执行。
安装
步骤 1: 下载扩展包
$ composer require m-h-1/cron-bundle
步骤 2: 启用扩展包
// config/bundles.php return [ // ... MH1\CronBundle\MH1CronBundle::class => ['all' => true], ];
步骤 3: 创建数据库表
为 Doctrine 实体创建表
DoctrineMigrations
$ bin/console doctrine:migrations:diff $ bin/console doctrine:migrations:migrate
原始 SQL
CREATE TABLE mh1_cron_job ( id CHAR(36) NOT NULL PRIMARY KEY, title VARCHAR(255) NOT NULL, description VARCHAR(255) NULL, command VARCHAR(255) NOT NULL, enabled TINYINT(1) NOT NULL, schedule VARCHAR(255) NOT NULL, execute_stalled TINYINT(1) NOT NULL ) COLLATE = utf8mb4_unicode_ci; CREATE TABLE mh1_cron_job_report ( id INT AUTO_INCREMENT PRIMARY KEY, cron_job_id CHAR(36) NOT NULL, start_time DATETIME NOT NULL, end_time DATETIME NULL, exit_code INT NULL, output LONGTEXT NULL, duration INT NULL, CONSTRAINT fk_a297993479099ed8 FOREIGN KEY (cron_job_id) REFERENCES mh1_cron_job (id) ) COLLATE = utf8mb4_unicode_ci; CREATE INDEX idx_a297993479099ed8 ON mh1_cron_job_report (cron_job_id);
步骤 4: 添加到 crontab
将命令添加到 crontab 并将 PATH_TO_APPLICATION 替换为您的 Symfony 项目目录路径。
* * * * * PATH_TO_APPLICATION/bin/console mh1:cron:run
配置
# config/packages/mh1_cron.yaml mh1_cron: service: null # override job service with a custom service log_service: null # override logging service check_interval: 1000 # milliseconds to wait between the checks if a process is running (must be greater than 1) execution_time_zone: null # use a custom time zone for job scheduling, the default is the PHP default timezone lock_prefix: '' # use a prefix for cronjob logging, the default is empty string php_executable_path: null # use a custom path to php executable. e.g. /usr/local/php81/bin/php
自定义任务服务
# config/packages/mh1_cron.yaml mh1_cron: service: App\Service\CustomCronJobService
不同的日志服务
# config/packages/mh1_cron.yaml mh1_cron: log_service: App\Service\CustomLogService
在调用 checkRunning 之间等待半秒(而不是一秒)
# config/packages/mh1_cron.yaml mh1_cron: check_interval: 500
使用自定义时区检查到期时间
每个 PHP 支持的时区字符串都是有效的 https://php.ac.cn/manual/en/timezones.php
# config/packages/mh1_cron.yaml mh1_cron: execution_time_zone: 'UTC'
# config/packages/mh1_cron.yaml mh1_cron: execution_time_zone: 'Europe/Berlin'
锁定名称前缀
symfony 锁组件使用命令名称(app:run
)作为锁的名称。
如果您想在同一系统上的不同部署或文件夹中运行相同的命令,您必须使用此参数来前缀锁的名称,例如 instance1:app:run
,instance2:app:run
。
# config/packages/mh1_cron.yaml mh1_cron: lock_prefix: 'second_instance'
使用自定义的 PHP 可执行文件路径
# config/packages/mh1_cron.yaml mh1_cron: php_executable_path: '/usr/local/php81/bin/php'