dades/scheduledtask

用于安排任务的 Symfony 扩展包

v1.0.5 2019-08-08 17:01 UTC

This package is auto-updated.

Last update: 2024-09-25 01:17:10 UTC


README

A Symfony Bundle that schedule tasks and commands on Windows and Linux.
它使用 Linux 上的 cron 系统在两个操作系统上。

安装

  1. 运行以下命令将扩展包添加到您的项目作为 composer 依赖项
    composer require dades/scheduledtask

  2. 将扩展包添加到您的应用程序内核

// app/AppKernel.php
public function registerBundles()
{
    // ...
    $bundle = array(
        // ...
        new Dades\ScheduledTaskBundle\DadesScheduledTaskBundle(),
    );
    // ...

    return $bundles;
}
  1. 如果您之前没有创建数据库,请运行 php bin/console doctrine:database:create

  2. 然后您必须创建存储计划任务的表
    php bin/console doctrine:schema:update --force

Windows 操作系统

  1. 您必须告诉系统每分钟检查是否有任务应该运行。为此,请在您的 cmd 中运行以下命令
    schtasks /CREATE /TN "uniqueName" /TR "php D:\path\to\your\project\bin\console cron:run" /SC minute

请确保 schtasks 在您的系统上全局安装。

Linux 操作系统

  1. 您必须告诉系统每分钟检查是否有任务应该运行。为此,您必须在 crontab 中添加 cronjob
    1. 运行 crontab -e 来编辑您的 crontab

    2. 在文件中添加 * * * * * php /path/to/your/project/bin/console cron:run >> ~/tmp 2>&1

工作原理

现在您已经准备好创建所有想要的计划任务。您只需处理这两个类
Dades\ScheduledTaskBundle\Entity\ScheduledTask
Dades\ScheduledTaskBundle\Service\ScheduledTaskService

注入处理 ScheduledTask 类的服务

use Dades\ScheduledTaskBundle\Service\ScheduledTaskService;

public function indexAction(Request $request, ScheduledTaskService $scheduled)
{
    //code
}

请注意,这是一个服务,因此您可以在任何地方注入它。

创建计划任务

一旦服务被注入,您可以执行以下操作

public function indexAction(Request $request, ScheduledTaskService $scheduledTaskService)
{
    $task = $scheduledTaskService->create();
    $task->setCommand("php --version")->setCronExpresion("* * * * *");
    $scheduledTaskService->save($task);

    return new Response("it works");
}

在此示例中,"php --version" 命令将每分钟运行一次。

获取一个或多个计划任务

您可以通过 ID 获取任务或获取数组中的所有任务。例如

public function indexAction(Request $request, ScheduledTaskService $scheduledTaskService)
{
    //get the task with id 1
    $task = $scheduledTaskService->getScheduledTask(1);
    //get all tasks
    $tasks = $scheduledTaskService->getScheduledTasks();

    //...
}

更新计划任务

要更新任务,只需设置要更改的值并调用 ScheduledTaskService

public function indexAction(Request $request, ScheduledTaskService $scheduledTaskService)
{
    //get the task with id 1
    $task = $scheduledTaskService->getScheduledTask(1);
    $task->setCommand("crontab -l")->setCronExpresion("0 5 * * *");
    $scheduledTaskService->update($task);

    //...
}

删除任务

您必须获取要删除的任务并调用删除方法

public function indexAction(Request $request, ScheduledTaskService $scheduledTaskService)
{
    //get the task with id 1
    $task = $scheduledTaskService->getScheduledTask(1);
    $scheduledTaskService->delete($task);

    //...
}

魔法发生的地方

现在您知道了如何安装、设置和处理计划任务,但您还不知道它们在哪里执行。
只需查看 Dades\ScheduledTaskBundle\Command\RunCronCommand 类。

if ($this->scheduledTaskService->isDue($task)) {
    exec($task->getCommand(), $stderr, $status);

这两行是关键。
第一行检查任务 $task 是否应该立即运行。
第二行执行命令。

更多信息

stdout 和 stderr 流被记录在 var/logs/dades_scheduled_task_bundle.log 中。
多亏了这个文件,您有了所有任务执行的历史记录。
如果文件不存在,请不要担心,它将自动创建。

此扩展包使用 dragonmantank/cron-expression 库。
此库读取每个任务的 cron 表达式以确定该任务是否应该立即运行。
我邀请您在此处了解更多信息 这里