Тонкая настройка почты

Столкнулся с тем, что при добавлении топиков, происходят достаточно сильные тормоза. После проведённого анализа выяснилось, что проблема тормозов ПОЧТА. При публикации топика происходит рассылка по всем пользователям, которые имеют отношение к блогу, в который происходит размещение материала.

При включении отложенной рассылки, всё приходит в порядок, но есть один очень не маловажный момент. Письма о регистрации, активации аккаунта или напоминания пароля, должны приходить незамедлительно.
Предлагаю к вашему вниманию следующий фикс.

В конфиге config/config.local.php добавляем следующие настройки

// Указывает на необходимость использовать режим отложенной рассылки сообщений на email
$config['module']['notify']['delayed'] = true;
// Если опция установлена в true, систему будет собирать записи заданий удаленной публикации, для вставки их в базу единым INSERT
$config['module']['notify']['insert_single'] = true;
// Количество отложенных заданий, обрабатываемых одним крон-процессом
$config['module']['notify']['per_process'] = 10;


Далее исправляем файл classes/modules/notify/Notify.class.php

Находим в нём функцию

public function Send($oUserTo,$sTemplate,$sSubject,$aAssign=array(),$sPluginName=null) {


В этой функции находим строчку

if(Config::Get('module.notify.delayed')) {


И заменяем её на

$isNotifyDelayed = Config::Get('module.notify.delayed');
if (($sTemplate == "notify.registration_activate.tpl") || ($sTemplate == "notify.registration.tpl") || ($sTemplate == "notify.reactivation.tpl") || ($sTemplate == "notify.reminder_code.tpl") || ($sTemplate == "notify.reminder_password.tpl")) { $isNotifyDelayed = false; }
if($isNotifyDelayed) {


PS: Возможно разместил топик не в тот блог, но в другие писать к сожалению не могу. Видимо не хватает рейтинга или силы.

Небольшое дополнение:
Кто-то может забыть, поэтому напоминаю, что необходимо по крону запускать скрипт include/cron/notify.php

есть 2 варианта запуска.

1. используя HTTP.

для этого необходимо поправить .htaccess в папке include/cron/
содержание должно быть

Order Deny,Allow
Deny from all
Allow from XXX.XXX.XXX.XXX


вместо XXX.XXX.XXX.XXX укажите IP, с которого будет производиться HTTP запрос.
и в крон можно внести следующую запись

*/5 * * * *   wget -O- http://www.livestreet.ru/include/cron/notify.php >> /dev/null


2. либо из консоли.

и в крон можно внести следующую запись

*/5 * * * *   /usr/bin/php /vhosts/site.ru/www/include/cron/notify.php


Пути указывайте в соответствии с настройками вашего сервера.
Отремонтировать компьютер или ноутбук, а так же восстановить данные можно в компьютерном сервисе on-pc.ru. Вызов специалиста и предоставление гарантии будет приятным бонусом.

28 комментариев

avatar
Давно уже поднимался этот вопрос, но решение опубликовано только сейчас — спасибо.
  • dsg
  • +1
avatar
вот ещё по теме. может быть полезным livestreet.ru/blog/bugreport/14735.html
avatar
Спасибо, полезно.
avatar
dimkus может стоит отправить этот фикс в официальный репозиторий на GitHub? Спасибо.
  • EGO
  • +1
avatar
поддерживаю
avatar
Я не против. как только туда отправить этот фикс я к сожалению не знаю
avatar
В таком случае подождём тех, кто понимает как это сделать. Я сам в Git на ВЫ :-(
avatar
Не работает, письмо не приходит о регистрации, откатился на предыдущие настройки.
avatar
возможные причины:
1). Вы либо не внесли все описанные здесь изменения
2). У вас проблемы непосредственно с доставкой почты
3). У вас пилинная версия движка, где не соответствуют название шаблонов notify.registration_activate.tpl, notify.registration.tpl, notify.reactivation.tpl, notify.reminder_code.tpl, notify.reminder_password.tpl
avatar
После этих изменений все прекрасно работает.
avatar
Всё прекрасно работает. Крайне полезное изменение. dimkus-у еще раз спасибо за идею.

P.S. Я на основе этих изменения даже микро-плагин написал, чтобы код движка не ломать: inherits от Notify, метод Send переписать, список шаблонов писем, которые нужно всегда синхронно отсылать — в config.php плагина.
avatar
Кто знает к кому обращаться, чтоб функционал внесли в движок?
avatar
Странно, что разработчики сами не обратили внимание на данный топик. Обычно писать нужно ort .
avatar
написал сообщение автору LS. надеюсь, что функционал дополнят
avatar
Я написал пару дней назад на GitHub LS: github.com/livestreet/livestreet/issues/252. Но не имею никаких идей во что это перерастёт, и перерастёт ли вообще.
avatar
Если я правильно понимаю, то проблему с тормозами при добавлении комментариев и плюсовании/минусовании тоже решает?
avatar
Без этого исправления в конфиге есть специальная настройка. Только надо ещё один скрипт добавить в крон. Не раз уже это обсуждали.
avatar
Спасибо. Можно ссылку на решение? (О том, какой скрипт добавлять)
avatar
Этот топик решает проблему немедлянной доставки писем связанных с регистрацией аккаунта и напоминания пароля. Снимая тормоза с размещения топиков, комментов и т.д. т.к. включается режим отложенной доставки, но важные письма уходят сразу. В эти моменты пользователь не будет ждать, что там у вас по крону запустится какой-то скрипт.
avatar
Я-то как-бы понял и давным давно приделал себе фикс.
avatar
добавил в топик ещё информацию про крон. кто-то может упустить этот момент
avatar
2. либо из консоли.

и в крон можно внести следующую запись

*/5 * * * * /usr/bin/php /vhosts/site.ru/www/include/cron/notify.php

я правильно понял, что это нужно добавить на сервере в /etc/crontab?

нужно оставлять такое содержание или пользователя нужно прописать от которого запускать?
avatar
разобрался
avatar
Подскажите, что можно сделать, если не хватает оперативной памяти для рассылки почты по 15 тыс юзеров?

Странно, что при таких данных хостинга:
Intel® Xeon™
2 Core
50 GB SSD
8 GB DDR4
php_value memory_limit 512M
скрипт рассылки виснет наглухо, не в состоянии подкачать задание в prefix_notify_task

Дает ошибку: Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 71846183 bytes) in .../engine/lib/external/DbSimple/Generic.php on line 775

Мне говорит хостер, что скрипт кривой рассылки, поэтому так много потребляет…
avatar
хостер увеличил для тестинга php_value memory_limit 2048M

Ошибка:
SQL Error: MySQL server has gone away at .../classes/modules/notify/mapper/Notify.mapper.class.php line 82
Array ( [code] => 2006 [message] => MySQL server has gone away [query] => INSERT INTO prefix_notify_task ( user_login, user_mail, notify_subject, notify_text, date_created, notify_task_status ) VALUES

При том, что на 2000 подписчиках все работало. Складывается впечатление, что реально дерьмоскрипт этот рассыльщик…
avatar
РЕШЕНИЕ НАЙДЕНО!!!
конфиг $config['module']['notify']['insert_single'] надо поставить в положение false
Вообще-то стоило бы где-то это прописать разработчику…
avatar
Он там и стоит по умолчанию в таком положении.
github.com/livestreet/livestreet/blob/1.0.3-replication/config/config.php#L231
avatar
Да вы правы… Видимо после данного топика я изменил настройки и не мог понять, почему не работает. Стоило бы об этом элементы конфига подробней написать не разработчику, а топик-стартеру, т.к. это он в посте предложил такой конфиг…
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.