获取错误:在Laravel中发送邮件队列时的“最长执行时间”

时间:2017-08-26 16:49:21

标签: php laravel email laravel-queue

我使用Laravel Mail Queue发送快速邮件。

我有一个错误:

  

SendWelcomeEmail.php超过60秒的最长执行时间   (第38行)

很难描述我的错误,因为我没有使用Laravel的经验。所以,我试着一步一步地记录下我做了什么。

我的问题是:当用户点击发送信息时,Send Mail被激活,并且使用了太多时间来完成这项工作。这会影响用户体验。

我期待一个答案或其他方法来解决我的问题。

我的演示是一步一步制作的:

第1步

c:\xampp\htdocs\laravel-test>php artisan queue:table
Migration created successfully!
c:\xampp\htdocs\laravel-test>php artisan queue:failed-table
Migration created successfully!
c:\xampp\htdocs\laravel-test>php artisan migrate
Migrated: 2017_04_03_144759_create_jobs_table
Migrated: 2017_04_03_150557_create_failed_jobs_table

第2步:更新我的.env文件并设置电子邮件:

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:beQGwYyUPOTMtkbzDhft7swh68UJW7RqwAGwhELUfLI=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost:8000

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dongxanh
DB_USERNAME=admin
DB_PASSWORD=euEW12il

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=database

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=myemail@gmail.com
MAIL_PASSWORD=yxpszfarmxoperew
MAIL_ENCRYPTION=tls

第3步

php artisan make:mail EmailCustomer

在功能__contruct()

protected $content;

public function __construct($content)
{
    $this->content = $content;
}

功能build()

public function build()
{
    return $this->view('emails.contact')
                ->with('content',$this->content);
}

第4步:在views/emails/contact.blade.php中:

Name: {{ $content['name'] }} <br>
Title: {{ $content['title'] }} <br>
Email: {{ $content['email'] }} <br>
Phone number: {{ $content['phonenumber'] }} <br>
Body:

{{ $content['body'] }}

第5步:创建作业SendWelcomeEmail

php artisan make:job SendWelcomeEmail

它会创建SendWelcomeEmail.php,如下所示:

use Mail;
use App\Mail\EmailCustomer;

class SendWelcomeEmail implements ShouldQueue
{
    protected $content;

    public function __construct($content)
    {
        $this->content = $content;
    }
    public function handle()
    {
        sleep(60);

        $receiverAddress = 'myemail@gmail.com';
        $email = new EmailCustomer($content);
        Mail::to($receiverAddress)->queue($email);
    }
}

最后:当用户点击app\Http\Controllers\RegisterForm.php中的提交表单时,将作业发送到队列:

public function storeCustomer(Request $request) {
    Customer::create($request->all());

    $content = [
        'name'=> $request->input('name'), 
        'title'=> $request->input('title'), 
        'email'=> $request->input('email'),
        'phonenumber'  => $request->input('phonenumber'),
        'body' => $request->input('body')
        ];

    dispatch(new SendWelcomeEmail($content));
    return view('partials.success-mail');
}

我运行两个命令:

php artisan serve

php artisan queue:work

并经过测试。这个问题显示错误。

2 个答案:

答案 0 :(得分:1)

你不应该在这里使用sleep,删除它以使队列工作。

如果需要,可以尝试这样做以增加时间限制

 php artisan queue:work --timeout=0

或者您可以使用任务时间表:https://laravel.com/docs/5.4/scheduling

同时使用$this->content而不是$content

  $email = new EmailCustomer($content);

答案 1 :(得分:0)

您错过了这个:

QUEUE_CONNECTION=database