2016-03-07 88 views
0

我需要發送批量電子郵件,並且每封郵件都有唯一的消息。我正在嘗試foreach循環,但我不斷收到允許內存大小104857600字節用盡(試圖分配66字節)錯誤。 是否有可能使用swiftmailer執行foreach,或者有其他方法(消息包含唯一標記)。代碼:Yii2 swiftmailer - foreach郵件發送(批量)

$users = Users::find()->where(['email' => $emails])->all(); 

     foreach($users as $user): 


       $user->scenario = 'saveToken'; 

       $token = hash('sha256',microtime() . Yii::$app->security->generateRandomString(32)); 

       $user->token = $token; 

       $user->save(); 

       Email::oldUsers($user->email, $token); 


     endforeach; 

發送電子郵件:

static function oldUsers($userEmail, $token) 
    { 
     Yii::$app->mailer->compose('_oldUsers', ['token' => $token]) 
      ->setFrom('[email protected]') 
      ->setTo($userEmail) 
      ->setBcc(['[email protected]']) 
      ->setSubject('Sketchlist Account Activation') 
      ->send(); 
    } 
+0

有幾件事情y你可能會這樣做來產生這個錯誤。 也許你在創建大量的收件人時耗盡了內存。 ?嘗試一次只收到一封電子郵件,而不是嘗試一次所有電子郵件? – izk

回答

0

在您執行電子郵件功能嘗試這些。

ini_set("memory_limit", "-1"); 
set_time_limit(0); 

如果這不利於然後按照this post

0

我想告訴你我會怎麼編寫這一點。以防萬一它幫助某人,因爲這是一箇舊的,沒有答案的問題。

確實沒有必要爲此使用場景。這是一個簡單的任務。另外,你不需要在generateRandomString()之上散列。如果你想創建一個唯一的隨機token,只需使用generateRandomKey(),其長度默認爲32。

另外,使用save(false)update(false)。錯誤會關閉驗證。如果您不使用用戶輸入,並且您自己以編程方式輸入基於受控值的數據,則應禁用驗證規則。當我這樣做時,我更喜歡使用update,因爲當我們使用已經存在的模型時它更有意義。

在用戶IdentityInterface(COMMON \型號\ user.php的中晚期):

public function generateToken() 
{ 
    $this->token = Yii::$app->security->generateRandomString(); 
} 

public function getToken() 
{ 
    return $this->token; 
} 

在你的控制器:

public function actionTest() 
{ 
    $emails = ['[email protected]', '[email protected]', '[email protected]']; 
    $users = Users::find()->where(['email' => $emails])->all(); 

    foreach ($users as $user) 
    { 
     $user->generateToken(); 

     if ($user->update(false)) 
     { 
      Yii::$app->mailer->compose('_oldUsers', ['token' => $user->getToken()]) 
       ->setFrom(['[email protected]' => 'Your Name']) 
       ->setTo($user->email) 
       ->setBcc(['[email protected]']) 
       ->setSubject('Sketchlist Account Activation') 
       ->send(); 
     } 
    } 
} 
0

,如果你有foreach循環,你應該嘗試的內存問題像這樣批量檢索數據檢索例如每次迭代中的10條記錄

foreach (Users::find()->where(['email' => $emails])->each(10) as $user) { 

}