dades / scheduledtask
用于安排任务的 Symfony 扩展包
Requires
- php: ^7.0
- doctrine/doctrine-bundle: ^1.3
- dragonmantank/cron-expression: ^2.3
- symfony/console: ^2.8 || ^3.0 || ^4.0
- symfony/framework-bundle: ^3.4
Requires (Dev)
- symfony/phpunit-bridge: ^3.0
README
A Symfony Bundle that schedule tasks and commands on Windows and Linux.
它使用 Linux 上的 cron 系统在两个操作系统上。
安装
-
运行以下命令将扩展包添加到您的项目作为 composer 依赖项
composer require dades/scheduledtask
-
将扩展包添加到您的应用程序内核
// app/AppKernel.php public function registerBundles() { // ... $bundle = array( // ... new Dades\ScheduledTaskBundle\DadesScheduledTaskBundle(), ); // ... return $bundles; }
-
如果您之前没有创建数据库,请运行
php bin/console doctrine:database:create
-
然后您必须创建存储计划任务的表
php bin/console doctrine:schema:update --force
Windows 操作系统
- 您必须告诉系统每分钟检查是否有任务应该运行。为此,请在您的 cmd 中运行以下命令
schtasks /CREATE /TN "uniqueName" /TR "php D:\path\to\your\project\bin\console cron:run" /SC minute
请确保 schtasks 在您的系统上全局安装。
Linux 操作系统
- 您必须告诉系统每分钟检查是否有任务应该运行。为此,您必须在 crontab 中添加 cronjob
-
运行
crontab -e
来编辑您的 crontab -
在文件中添加
* * * * * 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 表达式以确定该任务是否应该立即运行。
我邀请您在此处了解更多信息 这里。