我有一个ftp函数,当单击一个按钮时,该文件将文件从一个文件夹移动到另一个文件夹(比如文件夹a到文件夹b)。它完美地运作。我想要一个在调用上述函数后30分钟运行的函数(即文件从a移到b后)。我怎样才能在laravel中安排这样的任务?
我想这样做,因为在移动该文件后,很少有函数被执行,然后如果该人忘记删除该文件,那么这可能是危险的。所以我需要检查,文件从a移动到b后30分钟,文件是否已被移回或没有。
答案 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)。