https://blog.csdn.net/why444216978/article/details/101455602
单独队列处理############################
<?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 App\Models\Poststest;
use Illuminate\Support\Facades\Log;
class SendReminderEmail implements ShouldQueue
{
//生成的类实现了 Illuminate\Contracts\Queue\ShouldQueue 接口,
//这意味着这个任务将会被推送到队列中,而不是同步执行。
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $posts;
/**
* Create a new job instance.
* 创建一个新的任务实例。
* @return void
*/
public function __construct(Poststest $pp)
{
//
$this->posts = $pp;
}
/**
* Execute the job.
* 让队列用来调用此任务的 handle 方法
*
* @return void
*/
public function handle()
{
//
// echo "队列调用任务SendReminderEmail 打印出任务类的实例<br>-------------";
Log::info([
'id' => $this->posts->id,
'title' => $this->posts->title
]);
// print_r($this->posts);
}
}
事件监听器队列############################
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use App\Models\Poststest;
/**
* Class OrderShipped 事件
* @package App\Events
*/
class OrderShipped
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $post;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Poststest $post)
{
//
$this->post = $post;
// echo "事件OrderShipped以调用,即将分发到监听器<br>--------------------";
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
<?php
namespace App\Listeners;
use App\Events\OrderShipped;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Log;
/**
* Class SendShipmentNotification 监听器
* @package App\Listeners
*/
class SendShipmentNotification implements ShouldQueue
{
use InteractsWithQueue;
/**
* 任务应该发送到的队列的名称
*
* @var string|null
*/
public $connection = 'database';
public $queue = 'listeners';
public $delay = 60 * 1;
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param OrderShipped $event
* @return void
*/
public function handle(OrderShipped $event)
{
$ee = $event->post->id;
echo "监听器SendShipmentNotification处理中。。。。<br/>-----------------------";
// print_r($ee);
// return false;
Log::info("队列处理:" . $ee);
// return false;
}
//有时候队列中的事件监听器可能会执行失败。如果队列中的监听器任务执行时超出了队列进程定义的最大尝试次数,
//failed 方法接收事件实例和导致失败的异常
public function failed(OrderShipped $event, $exception)
{
//
}
}
<?php
namespace App\Listeners;
use App\Events\OrderShipped;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Log;
class SendShipmentNotification2
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param OrderShipped $event
* @return void
*/
public function handle(OrderShipped $event)
{
$ee = $event->post->id;
echo "监听器SendShipmentNotification2处理中。。。。<br/>-----------------------";
// print_r($ee);
// return false;
Log::info("非队列处理:" . $ee);
// return false;
}
}
创建控制器方法调用@@@@@@@@@@@@@@(
Route::get('posts', 'PostsController@shijianfenfa');
)
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Events\OrderShipped;
use App\Models\Poststest;
use App\Jobs\SendReminderEmail;
use Carbon\Carbon;
class PostsController extends Controller
{
//
public function shijianfenfa()
{
$pp = Poststest::all();
// print_r($pp);
//事件分发 部分任务加入队列延迟1分钟
foreach ($pp as $item) {
event(new OrderShipped($item));
}
// 队列
// 加入队列延迟3分钟
foreach ($pp as $item) {
SendReminderEmail ::dispatch($item)->delay(Carbon::now()->addMinutes(3));
}
// SendReminderEmail::dispatch(Poststest::all())->delay(Carbon::now()->addMinutes(10));
}
}
访问控制器将任务加入队列
运行队列命令:我这里定义了两个队列名字 listeners default
php artisan queue:work database --queue=listeners,default