我想用Laravel框架創建一個一次可發送超過10萬封郵件的郵件爆破器。
我的命令:
public function handle()
{
$blastId = $this->引數('blast')。
$blast = Blast::find($blastId)。
activity()-> performedOn($blast)->log('Blast is sending')。
foreach ($blast->unsentLogs as $log) {
try {
Mail::queue((new BlastEmail($log))->onQueue('emails'/span>))。
} catch (Exception $e) {
activity('send_failed')-> performedOn($log->contact)->causeBy($log)->log('Email send failed: '. $e->getMessage())。
}
}
$blast->status = 'served'。
$blast-> save();
activity()-> performedOn($blast)->log('Blast is sent')。
return 0。
}
我的爆炸性郵件構造:
public function __construct(BlastLog $log)
{
$contact = $log-> contact;
$blast = $log->blast。
$this->content = $blast->內容。
$this->content = str_replace('**UNSUB**'/span>, 'https://urltounsubscribe.com'/span>, $this->content);
$this->subject = $blast-> subject。
$this->to($contact->email, "Name") 。
$this->from($blast-> from_email, $blast->from_name)。
$log-> sent_at = now();
$log-> save();
}
我的代碼可以在30秒內處理1000封以下的郵件,但是為什么要花很長的時間來發送大約10萬封郵件?它應該只需要3000秒來處理10萬封郵件,但它已經超過了3個小時,仍然沒有完成。如何改進我的代碼?
我認為問題出在$blast->unsentLogs,它有超過100k的收集行,使得它需要大量的RAM。
也許我需要將$blast->unsentLogs分成一些部分/塊。但這樣做的最佳做法是什么?它應該使用查詢生成器,對嗎?但我不知道該怎么做。
uj5u.com熱心網友回復:
是的,你的問題顯然是在$blast->unsentLogs。PHP不能處理100k的collections,那是一個很大的問題。
你應該chunk結果,而不是一下子得到它們...
你的代碼應該是:
你的代碼應該是:
public function handle()
{
$blastId = $this->引數('blast')。
$blast = Blast::find($blastId)。
activity()-> performedOn($blast)->log('Blast is sending')。
$blast->unsentLogs()-> chunk(100, function (Collection $logs) {
foreach ($logs as $log) {
try {
Mail::queue((new BlastEmail($log))->onQueue('emails') 。)
} catch (Exception $e) {
activity('send_failed')-> performedOn($log->contact)->causeBy($log)->log('Email send failed: '. $e->getMessage())。
}
}
});
$blast->status = 'served'。
$blast-> save();
activity()-> performedOn($blast)->log('Blast is sent')。
return 0。
}
閱讀更多關于chunk.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/324236.html
標籤:
