laravel 获取一系列计划任务

63lcw9qa  于 2023-10-22  发布在  其他
关注(0)|答案(4)|浏览(205)

使用Laravel task scheduler,我在app/Console/Kernel.php中创建了许多任务
例如:

$schedule->command('some:command')
    ->daily();

$schedule->command('another:command')
    ->daily();

我想在 Jmeter 板上显示计划命令的列表、频率和上次/下次运行时间,但我不确定如何获得计划事件的列表。有没有办法做到这一点?

ux6nzvsh

ux6nzvsh1#

不幸的是,实际上没有现成的支持。您需要做的是扩展artisan schedule命令并添加list特性。幸运的是,有一个简单的类可以运行:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Console\Scheduling\Schedule;

class ScheduleList extends Command
{
    protected $signature = 'schedule:list';
    protected $description = 'List when scheduled commands are executed.';

    /**
     * @var Schedule
     */
    protected $schedule;

    /**
     * ScheduleList constructor.
     *
     * @param Schedule $schedule
     */
    public function __construct(Schedule $schedule)
    {
        parent::__construct();

        $this->schedule = $schedule;
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $events = array_map(function ($event) {
            return [
                'cron' => $event->expression,
                'command' => static::fixupCommand($event->command),
            ];
        }, $this->schedule->events());

        $this->table(
            ['Cron', 'Command'],
            $events
        );
    }

    /**
     * If it's an artisan command, strip off the PHP
     *
     * @param $command
     * @return string
     */
    protected static function fixupCommand($command)
    {
        $parts = explode(' ', $command);
        if (count($parts) > 2 && $parts[1] === "'artisan'") {
            array_shift($parts);
        }

        return implode(' ', $parts);
    }
}

这将为您提供php artisan schedule:list。现在这并不是你所需要的,但是你可以很容易地从你的Laravel堆栈中获得这个列表,通过执行:

Artisan::call('schedule:list');

这将为您提供一个计划命令列表。
当然,不要忘记注入Facadeuse Illuminate\Support\Facades\Artisan;

zujrkrfu

zujrkrfu2#

您可以在控制器方法中使用依赖注入来访问所需的对象。

<?php
namespace App\Http\Controllers;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Contracts\Console\Kernel;

class MyController extends Controller {
    public function index(Kernel $kernel, Schedule $schedule)
    {
        dd($schedule->events());
    }
}

注意,Kernel示例没有被使用,但需要被传递。

euoag5mw

euoag5mw3#

在Laravel Framework 8.22.1中,我通过将 app/Console/Kernel->schedule 方法公开,然后在Controller中工作:

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Events\Dispatcher;

    private function getScheduledJobs()
    {
        new \App\Console\Kernel(app(), new Dispatcher());
        $schedule = app(Schedule::class);
        $scheduledCommands = collect($schedule->events());

        return $scheduledCommands;
    }
4ioopgfo

4ioopgfo4#

我的任务是停止/启用和编辑频率的计划任务从管理 Jmeter 板。所以我在Kernel.php中foreach它们并在函数中捕获输出。

$enabled_commands = ConsoleCommand::where('is_enabled', 1)
        ->get();

    foreach ($enabled_commands as $command)
    {
        $schedule->command($command->command_name)
            ->{$command->frequency}($command->time)
            ->after(function () use ($command) {
                $this->log($command->command_name);
            });
    }

希望这对你有帮助。

相关问题