配置和测试 Laravel 任务调度环境描述尝试问题

2022-08-30 19:52:03

环境

  • 拉拉维尔版本 : 5.1.45 (LTS)

  • PHP 版本 : 5.6.1


描述

我正在尝试使用Laravel任务调度每1分钟运行一次命令。


尝试

我已将此行添加到我的 cron 选项卡文件中

* * * * * php artisan schedule:run >> /dev/null 2>&1

这是我的/app/Console/Kernel.php

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        \App\Console\Commands\Inspire::class,
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('inspire')->hourly();
        $schedule->command('echo "Happy New Year!" ')->everyMinute(); //<---- ADD HERE        }
}

我添加了此行$schedule->command('echo "Happy New Year!" ')->everyMinute();


问题

如何测试?

如何触发回声显示?

我怎么知道我所做的是否没有错?


答案 1

command()运行工匠命令。您尝试实现的目标 - 向操作系统发出命令 - 由exec('echo "Happy New Year!"')

测试取决于您要测试的内容:

  • 调度程序(每分钟)是否正常工作?

在这种情况下,您不必这样做。它在原始框架代码中进行了测试。

  • 命令是否成功?

好吧,您可以手动运行并查看输出。php artisan schedule:run

默认情况下,调度程序不生成任何输出 ()。但是,您可以通过链接或 (https://laravel.com/docs/5.1/scheduling#task-output)将运行脚本的输出重定向到任何文件。>> /dev/null 2>&1writeOutputTo()appendOutputTo()


对于更复杂的逻辑,请改为编写控制台命令(https://laravel.com/docs/5.1/artisan#writing-commands)并使用 - 这样您就可以编写漂亮的,可测试的代码。command()


答案 2

如果要对事件的调度进行单元测试,可以使用此示例。它基于默认的 inspire 命令:

public function testIsAvailableInTheScheduler()
{
    /** @var \Illuminate\Console\Scheduling\Schedule $schedule */
    $schedule = app()->make(\Illuminate\Console\Scheduling\Schedule::class);

    $events = collect($schedule->events())->filter(function (\Illuminate\Console\Scheduling\Event $event) {
        return stripos($event->command, 'YourCommandHere');
    });

    if ($events->count() == 0) {
        $this->fail('No events found');
    }

    $events->each(function (\Illuminate\Console\Scheduling\Event $event) {
        // This example is for hourly commands.
        $this->assertEquals('0 * * * * *', $event->expression);
    });
}

推荐