この記事では、タスクのスケジューリング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 stop
とexit
終了タイミングタスクを。
第二に、定期的にメールを達成するために
次のステップは、操作タイミングのメールにファイルを書き込むことです。で.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
よくやった !!!