Я хочу создать функцию информационного бюллетеня в своем приложении. Мне нужно отправить электронные письма около 5000-6000 после создания информационного бюллетеня. Когда бюллетень будет опубликован, он создаст почтовую очередь, которая будет храниться в базе данных. Поскольку для этого требуется много времени, мне нужно запустить его в фоновом режиме. Поэтому я сделал команду отправить почту с помощью YiiMailer и очереди электронной почты из базы данных.
Моя команда работает, но она заканчивается через некоторое время, не выполняя работу. Также мне нужно запустить его в фоновом режиме, но теперь это не так. Любая помощь оценивается.
Мой контроллер
public function actionSend(){ $command = new MailQueueCommand("test", "test"); $command->run(null); $this->render('index'); }
Мой MailQueueCommand.php
<?php class MailQueueCommand extends CConsoleCommand { public function run($args) { $criteria = new CDbCriteria(array( 'condition' => 'success=:success AND attempts < max_attempts', 'params' => array( ':success' => 0, ), )); $queueList = EmailQueue::model()->findAll($criteria); /* @var $queueItem EmailQueue */ foreach ($queueList as $queueItem) { $mail = new YiiMailer(); $mail->IsSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = true; $mail->Username = 'xxxx'; $mail->Password = 'xxxxx'; $mail->SMTPSecure = 'tls'; $mail->Port = 587; $mail->setFrom('exmampl@gmail.com', 'Name'); $mail->setTo($queueItem->to_email); $mail->setSubject($queueItem->subject); $mail->setBody($queueItem->message, 'text/html'); if ($this->sendEmail($mail)) { $queueItem->attempts = $queueItem->attempts + 1; $queueItem->success = 1; $queueItem->last_attempt = new CDbExpression('NOW()'); $queueItem->date_sent = new CDbExpression('NOW()'); $queueItem->save(); } else { $queueItem->attempts = $queueItem->attempts + 1; $queueItem->last_attempt = new CDbExpression('NOW()'); $queueItem->save(); } } } private function sendEmail($mail) { $sendStatus = false; if ($mail->send() > 0) $sendStatus = true; return $sendStatus; } } ?>