假设创建一个项目
queue-demo [自行创建]
配置数据库
项目根目录拷贝cp .env.example .env
vim .env 编辑
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=数据库名
DB_USERNAME=root
DB_PASSWORD=root
1.创建数据库
1.1 php artisan queue:table
创建列队失败表
1.2 php artisan queue:failed-table
2.迁移数(据迁移时由于数据库版本问题报错,标记 #9527 )
php artisan migrate
#数据库会多出一个jobs表 [惊不惊喜,刺不刺激!!!]
3.创建job列队任务控制器
php artisan make:job SendEmail
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Log;
class SendEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $email;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($email)
{
$this->email = $email;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
/*Mail::raw("队列测试",function(&$meassage){
$meassage->to($this->email);
});*/
// 模拟测试
Log::info("已发送邮件 - ". $this->email);
}
}
4.创建业务控制器
php artisan make:controller IndexController
/项目/App/Http/Controllers/IndexController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Http\Controllers\Controller;
use App\Jobs\SendEmail;
class IndexController extends Controller
{
/**
* [queue description]
* @return [type] [description]
*/
public function queue() {
dispatch(new SendEmail('1208713818@qq.com'));
}
}
6.配置 .env 文件
vim .env
...
QUEUE_DRIVER=database //修改成database
...
7.设置访问路由
..../../ routes/web.php
...
Route::get('queue', 'IndexController@queue');
...
8.浏览器访问[本地自行配置域名解析] http://www.demo.queue.cc/queue
检查数据库会多出两条数据[我刷新了两次,测试执行。。。。]
9.启动queue监听指令
php artisan queue:listen
我们还需要在命令行中运行Artisan命令执行队列中的任务。Laravel为此提供了三种Artisan命令:
1)queue:work 默认只执行一次队列请求, 当请求执行完成后就终止
2)queue:listen 监听队列请求,只要运行着,就能一直接受请求,除非手动终止;
3)queue:work --daemon 同listen一样, 只要运行着,就能一直接受请求,不一样的地方是在这个运行模式下,当新的请求到来的时候,不重新加载整个框架,而是直接 fire 动作。能看出来, queue:work --daemon 是最高级的,一般推荐使用这个来处理队列监听
注:使用 queue:work --daemon ,当更新代码的时候,需要停止,然后重新启动,这样才能把修改的代码应用上。
php artisan queue:work --daemon
命令行显示:
gongsidiannaodeMacBook-Pro:laravel-demo admin$ php artisan queue:listen
[2018-09-18 07:18:11][1] Processing: App\Jobs\SendEmail
[2018-09-18 07:18:11][1] Processed: App\Jobs\SendEmail
[2018-09-18 07:18:11][2] Processing: App\Jobs\SendEmail
[2018-09-18 07:18:11][2] Processed: App\Jobs\SendEmail
查看执行日志
[2018-09-18 07:18:11] local.INFO: 已发送邮件 - 1208713818@qq.com
[2018-09-18 07:18:11] local.INFO: 已发送邮件 - 1208713818@qq.com
队列执行成功完成后,数据库里的记录自动删除。
辅助操作 #9527
/项目/App/Providers/AppServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema; //添加引用
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
Schema::defaultStringLength(191); //添加此行
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}