1 回答

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
基本上有兩種方法可以解決您的問題:
創(chuàng)建一個(gè) Laravel Artisan 命令(您也可以使用 Laravel 提供的其他方法,但我發(fā)現(xiàn) Artisan 更有趣且更靈活,有助于避免返工)并相應(yīng)地安排它。
創(chuàng)建一個(gè)隊(duì)列作業(yè)并在稍后派發(fā)它,但它有一些限制,例如 Amazon SQS 隊(duì)列服務(wù)的最大延遲時(shí)間為 15 分鐘。
現(xiàn)在,要做的是:
在我看來,您應(yīng)該使用解決方案 1,因?yàn)樗`活并且給您更多的控制權(quán)。
隊(duì)列用于兩件事。首先,理想情況下,您要執(zhí)行的任務(wù)應(yīng)在接下來的 30-45 分鐘內(nèi)完成。其次,任務(wù)是時(shí)間密集型的,您不想因此而阻塞線程。
現(xiàn)在是有趣的部分。注意:您不必?fù)?dān)心,Laravel 會(huì)為您執(zhí)行大部分步驟。為了不跳過知識(shí),我提到了每一步。
第 1 步:運(yùn)行以下命令創(chuàng)建一個(gè) Artisan 控制臺(tái)命令(記住要在項(xiàng)目的根路徑中。):
php?artisan?make:command?PublishSomething
該命令現(xiàn)在可用于進(jìn)一步開發(fā),網(wǎng)址為app/Console/Commands
。
第 2 步handle
:您將在類中看到一個(gè)方法,如下所示,這是您所有邏輯所在的地方。
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class PublishSomething extends Command
{
? ? /**
? ? ?* The name and signature of the console command.
? ? ?*
? ? ?* @var string
? ? ?*/
? ? protected $signature = 'something:publish';
? ? /**
? ? ?* The console command description.
? ? ?*
? ? ?* @var string
? ? ?*/
? ? protected $description = 'Publishes something amazing!';
? ? /**
? ? ?* Create a new command instance.
? ? ?*
? ? ?* @return void
? ? ?*/
? ? public function __construct()
? ? {
? ? ? ? parent::__construct();
? ? }
? ? /**
? ? ?* Execute the console command.
? ? ?*
? ? ?* @return mixed
? ? ?*/
? ? public function handle()
? ? {
? ? ? ? //
? ? }
}
第 3 步:讓我們?cè)?handle 方法中添加一些邏輯
/**
?* Execute the console command.
?*
?* @return mixed
?*/
public function handle()
{
? ? $this->info('Publishing something cool!');
? ? // you can add your own custom logic here.
}
第 4 步:添加邏輯后,現(xiàn)在我們需要對(duì)其進(jìn)行測(cè)試,您可以這樣做:
php artisan something:publish
第 5 步:我們的功能運(yùn)行正?!,F(xiàn)在我們將安排命令。在里面app/Console你會(huì)發(fā)現(xiàn)一個(gè)文件Console.php,這個(gè)類負(fù)責(zé)所有的任務(wù)調(diào)度注冊(cè),在我們的例子中。
<?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 = [
? ? ? ? //
? ? ];
? ? /**
? ? ?* Define the application's command schedule.
? ? ?*
? ? ?* @param? \Illuminate\Console\Scheduling\Schedule? $schedule
? ? ?* @return void
? ? ?*/
? ? protected function schedule(Schedule $schedule)
? ? {
? ? ? ? // $schedule->command('inspire')->hourly();
? ? }
? ? /**
? ? ?* Register the commands for the application.
? ? ?*
? ? ?* @return void
? ? ?*/
? ? protected function commands()
? ? {
? ? ? ? $this->load(__DIR__.'/Commands');
? ? ? ? require base_path('routes/console.php');
? ? }
}
注意這里的調(diào)度函數(shù),這是我們將添加調(diào)度邏輯的地方。
第 6 步:現(xiàn)在我們將安排我們的命令每 5 分鐘運(yùn)行一次。你可以很容易地改變時(shí)間段,Laravel 提供了一些預(yù)制的頻率選項(xiàng),你也有自己的自定義時(shí)間表。
/**
?* Define the application's command schedule.
?*
?* @param? \Illuminate\Console\Scheduling\Schedule? $schedule
?* @return void
?*/
protected function schedule(Schedule $schedule)
{
? ? $schedule->command('something:publish')->everyFiveMinutes(); // our schedule
}
第 7 步:現(xiàn)在,Laravel 的任務(wù)調(diào)度程序本身依賴于 Cron。因此,要啟動(dòng)計(jì)劃,我們將以下文件添加到我們的 crontab。
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
就是這樣!我們完了。您已經(jīng)創(chuàng)建了自己的自定義命令并計(jì)劃每 5 分鐘執(zhí)行一次。
- 1 回答
- 0 關(guān)注
- 168 瀏覽
添加回答
舉報(bào)