首頁 > php框架 > Laravel > 主體

Laravel 佇列發送郵件

藏色散人
發布: 2019-10-21 13:36:08
轉載
2844 人瀏覽過

批次處理任務的場景在我們開發中是經常使用的,例如郵件群發,訊息通知,短信,秒殺等等,我們需要將這個耗時的操作放在隊列中來處理,從而大幅度縮短Web請求和相應的時間。

下面講解下Laravel中佇列的使用

設定檔config/queue.php

<?php
return [
    &#39;default&#39; => env(&#39;QUEUE_DRIVER&#39;, &#39;sync&#39;),
    &#39;connections&#39; => [
        &#39;sync&#39; => [
            &#39;driver&#39; => &#39;sync&#39;,
        ],
        &#39;database&#39; => [
            &#39;driver&#39; => &#39;database&#39;,
            &#39;table&#39; => &#39;jobs&#39;,
            &#39;queue&#39; => &#39;default&#39;,
            &#39;retry_after&#39; => 90,
        ],
        &#39;beanstalkd&#39; => [
            &#39;driver&#39; => &#39;beanstalkd&#39;,
            &#39;host&#39; => &#39;localhost&#39;,
            &#39;queue&#39; => &#39;default&#39;,
            &#39;retry_after&#39; => 90,
        ],
        &#39;sqs&#39; => [
            &#39;driver&#39; => &#39;sqs&#39;,
            &#39;key&#39; => &#39;your-public-key&#39;,
            &#39;secret&#39; => &#39;your-secret-key&#39;,
            &#39;prefix&#39; => &#39;https://sqs.us-east-1.amazonaws.com/your-account-id&#39;,
            &#39;queue&#39; => &#39;your-queue-name&#39;,
            &#39;region&#39; => &#39;us-east-1&#39;,
        ],
        &#39;redis&#39; => [
            &#39;driver&#39; => &#39;redis&#39;,
            &#39;connection&#39; => &#39;default&#39;,
            &#39;queue&#39; => &#39;default&#39;,
            &#39;retry_after&#39; => 90,
        ],
    ],
    &#39;failed&#39; => [
        &#39;database&#39; => env(&#39;DB_CONNECTION&#39;, &#39;mysql&#39;),
        &#39;table&#39; => &#39;failed_jobs&#39;,
    ],
];
登入後複製

設定檔預設使用的是同步驅動sync,每一種佇列驅動的配置都可以在該檔案中找到, 包括資料庫, Beanstalkd, Amazon SQS, Redis。其中也包含了一個null佇列驅動用於那些放棄佇列的任務。 failed配置項目用於配置失敗佇列任務存放的資料庫及資料表。 

接下來我們需要建立一個佇列任務類別。

建立佇列任務類,之後會在app/Jobs目錄下產生一個SendEmail.php的檔案

php artisan make:job SendEmail
登入後複製
<?php
namespace App\Jobs;
use App\User;
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;
class SendEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    protected $user;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(User $user)
    {
        $this->user = $user;
    }
    /**
     * 执行队列的方法 比如发送邮件
     *
     * @return void
     */
    public function handle()
    {
      $user = $this->user;
      
      Mail::raw(&#39;这里填写邮件的内容&#39;,function ($message){
             // 发件人(你自己的邮箱和名称)
            $message->from(&#39;your_email@163.com&#39;, &#39;yourname&#39;);
            // 收件人的邮箱地址
            $message->to($this->user);
            // 邮件主题
            $message->subject(&#39;队列发送邮件&#39;);
        });
    }
}
登入後複製

任務類別建立完之後到控制器把資料加入到佇列

建立發送訊息的控制器使用dispatch方法手動分發任務,方法裡傳一個任務類別的實例

<?php
namespace App\Http\Controllers;
use App\Jobs\SendEmail;
use App\User;
class MessageController extends Controller
{
    public function index()
    {
        $user = User::find(1);
        $this->dispatch(new SendEmail($user));
    }
}
登入後複製

然後訪問瀏覽器,運行項目把任務推送到佇列中。然後使用Artisan指令,執行佇列裡的任務

php artisan queue:

#● queue:work 預設只執行一次佇列請求, 當請求執行完成後就終止;

● queue:listen 監聽佇列請求,只要運作著,就能一直接受請求,除非手動終止;

● queue:work --daemon同listen一樣,不同的是work不需要再載入框架,直接運行任務,一般建議使用這個來處理佇列監聽。

● 附註:使用 queue:work --daemon ,當更新程式碼的時候,需要停止,然後重新啟動,這樣才能把修改的程式碼應用上。

更多Laravel相關技術文章,請造訪Laravel框架入門教學專欄進行學習!

以上是Laravel 佇列發送郵件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板