Laravel5.6は、タイミングのメールを達成するためにスケジュールされたタスクを使用します

この記事では、タスクのスケジューリングLaravelの達成を支援するために、Linuxのcrontabのスケジュールされたタスクを使用することです

まず、プロジェクトを作成します

1.端末、コマンドを実行しlaravel new crontab、データベースを含め、そのローカル正常な動作を保証します。その後の行に展開。phpstrom、サーバーへの接続コードが正しくサーバーに送信できることを確認してください。
2、端末はコマンドを実行し、タスクタイプを作成します。php artisan make:command SendEmail
変更、3 SendEmail.phpファイルを

protected $signature = 'email:send';
protected $description = '定时发邮件测试';

次のように4、最初の電子メールには、ファイル内の現在の時刻を書き込み、最初のテストファイルの書き込みのタイミングに、慌てる必要はありません

public function handle()
{
  //写入文件
  file_put_contents("/var/www/crontab/file.txt", date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);
}

注:PHP_EOL時間リストラップを表し、後者はFILE_APPENDバックレコードを追加指します。

5、修正app/Console/Kernel.phpファイルを:

protected $commands = [
    Commands\SendEmail::class //注册任务类
];

protected function schedule(Schedule $schedule)
{
	//每分钟执行一次文件的写入
    $schedule->command('email:send')
        ->everyMinute();
}

6、サーバ上で、プロジェクトに:cd /var/www/crontab、最初のサーバーのチェックPHP、インストールパスをコマンドを実行します。which php私のPHPパスを/usr/bin/phpした後、パスダウンコピーを保存し、コマンドを実行します。crontab -e[開く]を選択し、最初の4つの提言を選択します。最後の行に次のコードを追加します。

* * * * * /usr/bin/php /var/www/crontab/artisan schedule:run >> /dev/null 2>&1

注:ここでは前部/usr/bin/phpサーバーの代わりにPHPインストールパス、代表プロジェクトディレクトリの後部。
また、5つのアスタリスク上記のコマンドの前に*分、時間、日、月、週を表します。
分:整数、デフォルトのアスタリスクと1分間アスタリスク0-59 / 1。
営業時間:0〜23の整数。
デイ:整数1-31。
月:整数1-12。
週:0-7、0から7の整数日曜日表します。
crontabの-l現在のスケジュールされたタスクをリストします。

7、タスクを開始sudo service cron restart、オープン、FZルートサーバプロジェクトでのビューに、file.txtファイルの書き込みと分ごとに実行する時間があるかどうか。コマンドの実装を成功確認後service cron stopexit終了タイミングタスクを。

第二に、定期的にメールを達成するために

次のステップは、操作タイミングのメールにファイルを書き込むことです。.envメールを設定するために必要なファイルに関する情報。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.qq.com
MAIL_PORT=465
MAIL_USERNAME=244500972@qq.com
MAIL_PASSWORD=***** //填自己的邮箱密码
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=244500972@qq.com
MAIL_FROM_NAME=huangdj

1、オープンweb.php、追加ルート

$this->any('mail', 'HomeController@mail');//发邮件

図2に示すように、Home次のコード・コントローラを追加します。

public function mail()
{
   //第一种方法
   \Mail::raw('定时发送邮件 测试', function ($message) {
       $message->from('[email protected]', '长乐未央');
       $message->subject('邮件主题 测试');
       $message->to('[email protected]');
   });

  //第二种方法
// \Mail::send('admin.mail', ['name' => 'holy'], function ($message) {
//     $message->to('[email protected]');
// });
}

テスト:ターミナル印刷ルーティングは、アドレスをルーティングすることは訪問にブラウザを取得するにはhttp://你的二级域名/admin/mail、メールボックスがメッセージを受信するかどうかを確認します。メッセージの受信に成功した場合、ダウンし続けます。

3、タスククラス開くSendEmail.php変更、ファイルをhandle次のように、この方法を:

public function handle()
{
//写入文件
// file_put_contents("/var/www/crontab/file.txt", date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);

 \Mail::raw('定时发送邮件 测试', function ($message) {
    //查出要发邮件的所有用户的邮箱
    $customers = Customer::where('email', '<>', null)->get();
    foreach ($customers as $customer) {
         $message->from('[email protected]', 'huangdj');
         $message->subject('邮件主题 测试');

          //执行发送
         $message->bcc($customer->email);
      }
    });
}

最後に、サーバーへの現在のプロジェクトは、timerコマンドを起動しservice cron restart、メールメッセージを受信し、毎分後に実行されたかどうかを確認するために数分待ちます。

第三に、増加Redisのキュー

私たちは、電子メールを大量に送信したい場合は、我々は、バックエンドが長い操作を完了するように、メッセージが保存されているすべてのキューに送信されたキューを使用します。オンライン情報の多くは、ここで私が使用して、データベースキューを使用しているredisキューを。

1、.envファイルが変更QUEUE_DRIVER=syncされQUEUE_DRIVER=redis
、2打ち上げキューを、ターミナルのコマンドを実行します。redis-serverあなたは見つけるでしょうpredis、拡張インストールされていない、コマンドを実行します。composer require predis/predisインストールしてください。インストールが完了したら、Redisのを再起動してください。
3、タスクのカテゴリを作成します。php artisan make:job SendReminderEmail正常に実行がします後app/Jobs、ディレクトリを生成しSendReminderEmail.php、次のように、私たちはその内容を変更します。

<?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\Customer;
use Illuminate\Contracts\Mail\Mailer;
class SendReminderEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    protected $customer;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(Customer $customer)
    {
        $this->customer = $customer;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle(Mailer $mailer)
    {
        $customer = $this->customer;

        $mailer->send('emails.reminder',['customer'=>$customer],function($message) use ($customer){
            $message->to($customer->email)->subject('新功能发布');
        });
    }
}

4、メールの部分図を作成しますresources/views/emails/reminder.blade.php

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div>
        亲爱的{{$customer->nickname}},您好,长乐教育新发布了Laravel5.6使用redis实现群发邮件功能,立即去体验下吧:
        <a href="https://www.whphp.com/">前往长乐教育</a>
    </div>
</body>
</html>

第四に、プッシュキューのタスク - マニュアル配布タスク

1、web.php次のルートを追加します。

Route::get('mail/sendReminderEmail/{id}','MailController@sendReminderEmail');

図2は、コントローラを作成する:php artisan make:controller MailController次のコードコントローラーライト。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Customer;
use Mail;
use Storage;
use App\Jobs\SendReminderEmail;
class MailController extends Controller
{
    //发送提醒邮件
    public function sendReminderEmail(Request $request, $id)
    {
        $customer = Customer::findOrFail($id);

        $this->dispatch(new SendReminderEmail($customer));
    }
}

3、キューリスナーを実行します。ブラウザでアクセスhttp://你的二级域名/mail/sendReminderEmail/63し、タスクにプッシュRedisキュー。コマンドラインで次のコマンドを実行します。php artisan queue:workその後、メールボックスがリマインダメールを受信します見に行きます。

図4に示すように、指定されたキューへプッシュタスクは、修正App\Console\Commands\SendEmail内部handleメソッドのコードは次のように

public function handle()
{
  \Mail::queue('定时发送邮件 测试', function ($message) {
      //查出要发邮件的所有用户的邮箱
      $customers = Customer::where('email', '<>', null)->get();
      foreach ($customers as $customer) {
           $message->from('[email protected]', 'huangdj');
           $message->subject('邮件主题 测试');

         //执行发送
		//$message->bcc($customer->email);

		//将任务推送到指定队列并延迟一分钟执行
        dispatch(new \App\Jobs\SendReminderEmail($customer->email))->onQueue('emails')->delay(60);
      }
  });
}

究極のテスト:メールが電子メール毎分受信されたかどうかを確認するには
:スタートredis-server
スタート:php artisan queue:work
スタート定期的な実装を:service cron restart

参考文献:http://laravelacademy.org/post/2012.html
http://laravelacademy.org/post/222.html#ipt_kb_toc_222_14

よくやった !!!

公開された14元の記事 ウォンの賞賛1 ビュー89

おすすめ

転載: blog.csdn.net/huangdj321/article/details/104929571