2016-03-07 3 views
0

Мне нужно отправить пакетные письма, и каждая почта имеет уникальное сообщение. Я пытаюсь использовать цикл foreach, но я продолжаю получать Допустимый размер памяти 104857600 байт исчерпан (пытался выделить 66 байт) Ошибка. Можно ли выполнить foreach с swiftmailer, или есть другой способ (сообщение содержит уникальный токен). Код: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

Есть несколько вещей, ou может сделать, чтобы произвести эту ошибку. Возможно, вы исчерпываете память при создании большого массива получателей. ? Попробуйте получить одно электронное письмо за раз, а не все письма в 1 попытке? – izk

ответ

0

Попробуйте эти в функции вы выполняете электронную почту.

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

Если это не помогает, то следовать this post

0

Я хочу показать вам, как я бы закодировать это. На всякий случай это помогает кому-то, так как это старый, без ответа вопрос.

Для этого действительно не нужно использовать сценарии. Это такая простая задача. Кроме того, вам не нужно делать хэш поверх generateRandomString(). Если вы хотите создать уникальный и случайный token, просто используйте generateRandomKey(), который по умолчанию имеет длину 32.

Также используйте save(false) или update(false). Фальсификация отменяет проверку. Если вы не используете пользовательский ввод, и вы сами программно вводите данные на основе контролируемых значений, вы должны отключить правила проверки. Я предпочитаю использовать update, когда я это делаю, поскольку имеет смысл, когда мы работаем с уже существующей моделью.

В вашем пользователе IdentityInterface (общие \ модель \ 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

, если у вас есть проблемы с памятью в цикле Еогеаспа вы должны попытаться извлекать данные такими партиями, как это, например, 10 записей на каждой итерации

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

} 
Смежные вопросы