在我的一个功能完成之后,如何在laravel中的特定时间段之后安排一个功能运行?

时间:2018-03-26 06:05:19

标签: php laravel laravel-5

我有一个ftp函数,当单击一个按钮时,该文件将文件从一个文件夹移动到另一个文件夹(比如文件夹a到文件夹b)。它完美地运作。我想要一个在调用上述函数后30分钟运行的函数(即文件从a移到b后)。我怎样才能在laravel中安排这样的任务?

我想这样做,因为在移动该文件后,很少有函数被执行,然后如果该人忘记删除该文件,那么这可能是危险的。所以我需要检查,文件从a移动到b后30分钟,文件是否已被移回或没有。

2 个答案:

答案 0 :(得分:2)

你需要CRON JOB - Laravel Scheduler

类示例:

namespace App\Console;

use DB;
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 = [
        //
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->call(function () {
            DB::table('recent_users')->delete();
        })->daily();
    }
}

然后你需要在服务器上启用cron作业:

* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

您有详细信息:https://laravel.com/docs/5.6/scheduling

很好的视频解释了一些事情:https://www.youtube.com/watch?v=mp-XZm7INl8

答案 1 :(得分:2)

这听起来像是一个使用Laravels队列的绝佳机会,它也允许延迟调度,正如您在查找queuing and delayed dispatching时可以在文档中找到的那样。

基本上,您需要一个可以按照以下

推送到队列的作业
<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class RemoveFileFromFtp implements ShouldQueue
{
    use Dispatchable, Queueable;

    protected $file;

    /**
     * Create a new job instance.
     *
     * @param  string $file
     * @return void
     */
    public function __construct(string $file)
    {
        $this->file = $file;
    }

    /**
     * Execute the job.
     *
     * @param  FtpService $ftpService
     * @return void
     */
    public function handle(FtpService $ftpService)
    {
        $ftpService->removeFileIfExists($this->file);
    }
}

然后你就可以像这样派遣这份工作:

function doSomethingWithFileOnFtp()
{
    // ... here you can do what you described

    // and then you queue a clean up job for the file
    RemoveFileFromFtp::dispatch($file)->delay(now()->addMinutes(30));
}

当然,此解决方案希望您正确设置Laravel队列。有不同的方法可以做到这一点,但我想文档是你最好的朋友(see here)。