定时执行任务其实非常简单,我们都知道php artisan命令会执行某个或多个任务,我们也可以自己定制任务,然后定时运行就可以了。所以定时执行任务我们分为2步,第一步,创建自定义php artisan命令,第二步,在console里面执行php artisan schedule:run,这样我们就可以一直监听并执行定时任务。
1.创建自定义定时执行任务
先执行命令:
php artisan make:command SendEmails
我们会看见在app/console/commands/SendEmails.php生成的这个文件:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class SendEmails extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'command:name';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
}
}
在这里我们做几件事:1.定义signature 2.填写description 3.在handle()方法里面填入想要操作的具体逻辑。所以我们可以改成:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class SendEmails extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'send:email';
/**
* The console command description.
*
* @var string
*/
protected $description = 'this will send an email';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
Mail::send();
//假的,你要写你自己的命令
echo "执行完之后返回的文字";
}
}
我们可以直接执行看下效果:
php artisan send:email
2.启动定时执行
在app/console/Kernel.php文件的schedule方法里添加你的命令,添加两个信息,第一个是命令,第二个是频率。laravel有很多频率的方法,可以参考laravel文档。
<?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();
$schedule->command("send:email")
->everyMinute();
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}
3.怎样让他一直监听执行呢?
php artisan schedule:run
这个命令可以执行您定义的所有定时的php artisan命令,我们可以直接加一次便足够运行所有的定时任务。找到你服务器执行定时任务的文件,添加下一行:
- cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
网友评论