如何解决Laravel队列在后台不工作
我正在尝试使用laravel队列发送批量电子邮件。到目前为止,我已经写下了逻辑并且可以正常工作,但是问题是,当我在控制器中编写逻辑时,这花费了很多时间,所以我考虑使用作业,但是问题仍然存在。
我的问题
我的问题是即使使用队列,我也无法在后台发送电子邮件。
控制器
public function newsletter(Request $request)
{
//dd($request->all());
dispatch(new SendEmail($request));
Session::flash('message','Email Sent');
Session::flash('class','success');
return redirect()->route('news');
}
工作
public function handle(Request $request)
{
//
$data = array(
'message' => $request->message,'subject' => $request->subject,'file' => $request->file("file")
);
$teachingLevel = $request->highest_teaching_level;
$school = $request->school;
$province = $request->province;
$district = $request->district;
$subject = $request->subject;
if ($teachingLevel != "" && $school != "" && $province != "" && $district != "") {
$email = User::where('highest_teaching_level',$teachingLevel)->where('current_school_name',$school)->where('address','LIKE','%'.$province.'%')->where('address','%'.$district.'%')->pluck('email');
}else{
$email = User::pluck('email');
}
foreach($email as $e)
{
Mail::to($e)->send(new NewsLetter($data,$subject));
}
}
电子邮件已发送,但不会在后台发生。也许与我在$request
函数中传递handle()
变量的方式有关。
任何帮助将不胜感激。谢谢!
解决方法
这是我在项目中使用Laravel作业的方式:
SampleJob.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\Services\SampleService;
class SampleJob implements ShouldQueue {
use Dispatchable,InteractsWithQueue,Queueable,SerializesModels;
// if you omit this value,you'll be in trouble,believe me
public $tries = 1;
private $param;
public function __construct($param) {
$this->param = $param;
}
public function handle(SampleService $service) {
// do something with $this->param
// Also,notice that you can type hint classes in handle function declaration for DI
$service->doSomething($this->param);
}
}
SampleController.php
namespace App\Http\Controllers;
use App\Jobs\SampleJob;
class SampleController extends Controller {
public function sampleMethod(Request $request) {
$param = $request->input('param');
SampleJob::dispatch($param); // $param will be passed to SampleJob constructor
// ...
}
}
需要注意的几点是:
- 阅读我的代码段中的注释
- 如果您使用基于数据库的队列,请首先使用
php artisan queue:table && php artisan migrate
进行迁移
- 使用artisan命令创建工作:
php artisan make:job Sample
- 不要忘记运行队列工作器:
php artisan queue:work
。要使其在后台运行:sudo nohup php artisan queue:work > ./storage/logs/queue-worker.log &
- 强烈建议:在部署中,使用Supervisor可使
php artisan queue:work
在后台运行 - 如果您设法使工作正常进行,所有延迟的工作(由于配置错误或未启动队列工作程序而被排队但未处理)将立即执行。
常见陷阱:
- 如果您未设置
$tries
参数,但由于某种原因您的作业引发了错误,laravel将尝试一次又一次地重试该作业,直到您的数据库关闭:( - 如果http用户和php用户不同,并且在工作中使用了
Log
,则十分之九的用户会在storage
目录中遇到权限问题。为避免此问题,请将'permission' => '0666'
添加到config/logging.php
的日志通道设置中 - 队列工作程序未检测到您的代码更改,因此在对代码库进行了一些更改之后,请
php artisan queue:restart
重新启动队列工作程序。
我的laravel版本:5.8
,如果您要使用“数据库”连接,则必须运行下一个迁移:
php artisan queue:table
php artisan migrate
还有一个事件和一个实现“ ShouldQueue”接口的侦听器,最后在“ providers / EventProvider.php”路径中并在“ EventProvider.php”文件中注册与一个或多个侦听器关联的事件。事件和侦听器,并带有下一个表示法:
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,],];
重要的是要掌握与以下队列有关的几点:重新启动命令
php artisan queue:restart
要使其正常工作,您需要运行Queue Listener:
php artisan queue:listen
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。