m-h-1/cron-bundle

维护者

详细信息

github.com/m-h-1/cron-bundle

来源

问题

安装次数: 4,368

依赖: 0

建议者: 0

安全性: 0

星标: 0

关注者: 2

分支: 1

开放问题: 0

类型:symfony-bundle

v1.3.0 2021-12-17 13:09 UTC

This package is auto-updated.

Last update: 2024-09-17 19:26:14 UTC


README

CI coverage

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:runinstance2: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'