Вы тоже застряли в красном, зная, почему это так, и как им пользоваться? Простой пример использования очередей сообщений для асинхронной отправки сообщений в Yii
Подготовка к повторному обследованию~~
Прежде всего, вам необходимо настроить службу redis. Я уже писал несколько статей раньше. Вы можете обратиться к https://segmentfault.com/a/11 вот.
Библиотека Yii redis: https://github.com/yiisoft/yi…
Использование composer для установки библиотек зависимостей redis
php composer.phar require --prefer-dist yiisoft/yii2-redis
Соответствующая конфигурация web.php:
return [
//....
'components' => [
'redis' => [
'class' => 'yii\redis\Connection',
'hostname' => 'localhost',
'port' => 6379,
'database' => 0,
],
]
];
На данный момент redis можно использовать для работы в Yii
Redis ~ ~ синхронизация и асинхронизация
Итак, как добиться асинхронной очереди сообщений для отправки почты?
Традиционный метод работы заключается в следующем:
Вводимая Пользователем Информация о Почте
Сервер получает данные, введенные пользователем, и отправляет их на почтовый сервер третьей стороны.
Почтовый сервер Третьей стороны Отправляет Почту и Возвращает Результат обработки
Асинхронная обработка отправки почты:
Пользователи вводят информацию, связанную с почтой
Храните регистрационную информацию в очереди памяти, чтобы сообщить пользователю об успешной отправке
Сервер отслеживает очередь памяти и по очереди отправляет почтовые данные в очередь памяти, которые не воспринимаются пользователем.
В чем разница между этими двумя?
Асинхронность лучше, чем синхронизация, потому что страница не блокируется и сокращает время ожидания пользователя.
Редис ~ ~ доставка почты
Принцип: Пользователи вводят информацию о почте, серверы получают информацию о входящей почте и вызывают почтовый процесс, который на самом деле является процессом присвоения атрибутов почтового класса. В это время мы можем захватить информацию о пользователе, сохранить ее в очереди, а затем по очереди прочитать информацию о почте и отправить ее.
// instantiate mail components
$mailer = Yii::$app->mailer->compose();
Mailer - > setFrom ('sender address');
Mailer - > setTo ('addressee');
Mailer - > setSubject ('Send Title');
//if ($mailer->send() && $this->reg($data, 'regbymail')) {
// Note that this itself is a direct call to the send method for sending and now override the parent method for processing with redis
if ($mailer->queue()) {
return true;
}В это время мы создадим экземпляр класса mail для отправки почты. В это время мы можем захватить почтовую информацию и сохранить ее в очереди.
redis;
if (empty($redis)) {
throw new \yii\base\InvalidConfigException('redis not found in config.');
}
// 0 - 15 select 0 select 1
// db => 1
$mailer = Yii::$app->mailer;
// Does the database stored in mail exist?
if (empty($mailer) || !$redis->select($mailer->db)) {
throw new \yii\base\InvalidConfigException('db not defined.');
}
// Grabbing Mail Information
$message = [];
$message['from'] =array_keys($this->from);
$message['to'] = array_keys($this->getTo());
$message['cc'] = array_keys($this->getCc());
$message['bcc'] = array_keys($this->getBcc());
$message['reply_to'] = array_keys($this->getReplyTo());
$message['charset'] = array_keys($this->getCharset());
$message['subject'] = array_keys($this->getSubject());
// Get mail information and sub-information
$parts = $this->getSwiftMessage()->getChildren();
if (!is_array($parts) || !sizeof($parts)) {
$parts = [$this->getSwiftMessage()];
}
foreach ($parts as $part) {
if (!$part instanceof \Swift_Mime_Attachment) {
// Get the content type
switch($part->getContentType()) {
case 'text/html':
$message['html_body'] = $part->getBody();
break;
case 'text/plain':
$message['text_body'] = $part->getBody();
break;
}
if (!$message['charset']) {
$message['charset'] = $part->getCharset();
}
}
}
// The serialized fetched content is stored in the queue
return $redis->rpush($mailer->key, json_encode($message));
}
}
The next step is to read the redis queue and send it.
redis;
if (empty($redis)) {
throw new \yii\base\InvalidConfigException('redis not found in config.');
}
// If there is data in the queue
if ($redis->select($this->db) && $messages = $redis->lrange($this->key, 0, -1)) {
$messageObj = new Message;
// Traveling through mailing lists
foreach ($messages as $message) {
$message = json_decode($message, true);
if (empty($message) || !$this->setMessage($messageObj, $message)) {
throw new \ServerErrorHttpException('message error');
}
if ($messageObj->send()){
$redis->lrem($this->key, -1, json_encode($message));
}
}
}
return true;
}
// Setting up message headers
public function setMessage($messageObj, $message)
{
if (empty($messageObj)) {
return false;
}
if (!empty($message['from']) && !empty($message['to'])) {
$messageObj->setFrom($message['from'])->setTo($message['to']);
if (!empty($message['cc'])) {
$messageObj->setCc($message['cc']);
}
if (!empty($message['bcc'])) {
$messageObj->setBcc($message['bcc']);
}
if (!empty($message['reply_to'])) {
$messageObj->setReplyTo($message['reply_to']);
}
if (!empty($message['charset'])) {
$messageObj->setCharset($message['charset']);
}
if (!empty($message['subject'])) {
$messageObj->setSubject($message['subject']);
}
if (!empty($message['html_body'])) {
$messageObj->setHtmlBody($message['html_body']);
}
if (!empty($message['text_body'])) {
$messageObj->setTextBody($message['text_body']);
}
return $messageObj;
}
return false;
}
}До сих пор мы реализовали очередь redis для асинхронной отправки почты