Задержка отправки личных сообщений в moodle

Задержка отправки личных сообщений в moodle

от Dmitriy Makarov -
Количество ответов: 5

Проблема следующего характера: при отправке личного сообщения страница периодически на какое-то время виснет на 1-7 минут, однако уведомление о сообщении на почту приходит мгновенно практически (задержка до 1 минуты максимум). Отладка никаких ошибок не выдает, sendmail настраивался по стандартной инструкции. Уже голову сломал... не пойму в чем может быть проблема... Может кто сталкивался с подобной проблемой?

В ответ на Dmitriy Makarov

Re: Задержка отправки личных сообщений в moodle

от Dmitriy Makarov -

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


moodle 3.1, стоит на ubuntu 16.0

В ответ на Dmitriy Makarov

Re: Задержка отправки личных сообщений в moodle

от Vadim Tabunshchik -
Изображение пользователя Developers
висит она на любой машине, работать с другими ресурсами сайта невозможно

Апач подвисает? Запустите ТОР и понаблюдайте за загрузкой процессора во время отправки сообщений, может ресурсов машины не хватает.

В ответ на Vadim Tabunshchik

Re: Задержка отправки личных сообщений в moodle

от Dmitriy Makarov -

с ресурсами проблем быть не должно, 8 гигов оперативы выделено и они динамические до 64... на процессоры в принципе больше 10% не загружаются, сетевухи разве что, но там 2 сетевухи на каждую линия в 100 мегабит... хотя посмотрю, спасибо. просто реально уже не знаю куда копать...

В ответ на Dmitriy Makarov

Re: Задержка отправки личных сообщений в moodle

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода

Важно понимать один нюанс работы moodle. На каждую сессию php (то есть по сути сессию пользователя) moodle делает блокировку. То есть если вы открыли сразу три вкладки, то сначала установится блокировка, обработается первая страница, а потом снимется блокировка. Всё это время вкладки 2 и 3 будут ждать освобождения блокировки. Если страница один обрабатывается долго, то для страниц 2 и 3 это выглядит, как будто ещё не загрузились, но загружаются, но на самом деле просто php ждёт освобождения блокировки. Если php завершится по таймауту, а блокировка так и не снимется, вы увидите пустую страницу. Если установить таймаут php подольше, что бы он стал больше таймаута ожидания освобождения блокировки в moodle, то вы увидите сообщение на желтом фоне о том, что не удалось дождаться освобождения сессии.

Но, блокируется именно сессия php, которая определяется по cookie из браузера. Если вы параллельно откроете другой браузер, то в нём всё будет нормально, хотя в первом страницы не будут открываться. То же самое, если закрыть и открыть браузер. Другие пользователи на других компьютерах тоже этого не заметят. Так что такое поведение хоть и неприятно, но, по крайней мере, не означает падения сервера и недоступности его для всех. В этом случае top ничего не покажет, процессор не будет занят во время ожидания снятия блокировки.

Теперь о причинах. У вас виснет именно отправка почты. Зависание часто проявляется из-за подключения к серверу по ssl  и когда сервер далеко (например, gmail). В этом случае, если речь о личном сообщении, где всего одно уведомление, это ещё полбеды. Если идет массовая рассылка уведомления с форума, процесс многократно длиннее. Для решения в этом случае на сервере с moodle ставится smtp-сервер в режиме релея, который очень быстро принимает почту от moodle локально и без шифрования, а затем уже сам, фоном, медленно переправляет её куда нужно. То есть в moodle вообще логин/пароль не указывается, а в настройках локального smtp-сервера уже указываются логин/пароль от внешнего сервера, через который пойдет почта. Возможно у Вас сервер получает почту, но не почему-то не закрывается сессия между php и smtp-сервером. php ждёт завершения smtp-сессии, а все остальные вкладки ждут завершения php. Тут следует включить отладку почты в moodle, может чего видно станет.

Если вы не указываете в настройках moodle smtp-сервер, то отправка идет в режиме, настроенном в параметрах php. В этом случае может быть ситуация, когда php вызывает команду операционной системы для отправки почты. Если эта команда почему-то не завершается (ну, например, требует нажать клавишу чтобы закрыться), то php ждет завершения этой команды, а все ждут завершения php. Может быть у вас что-то типа https://ubuntuforums.org/showthread.php?t=1577501

Вариант с отправкой через команду ОС хуже, чем вариант с локальным smtp-сервером, так как в случае с локальным smtp-сервером сервер сразу отчитается от доставке (а сам уже будет потом отправлять принятую почту фоном) и php продолжит выполнение, а значит страница быстро загрузится. В случае же с sendmail (если только тот отправляет почту не на локальный сервер) всё-равно придется ждать, пока sendmail соединится с внешним smtp-сервером, авторизуется и отправит почту, а уже после этого продолжит выполняться php-код. Тут в браузере может быть заметна задержка загрузки страницы.

Это, кстати, можно иногда использовать чтобы узнать, зарегистрированы ли логин/почта в moodle. На странице восстановления логина-пароля ввести логин/адрес. Если следующая страница грузится дольше, значит адрес есть в системе и на него отправляется почта. Если страница грузится моментально, значит отправка не идет, а значит и адрес не зарегистрирован.

В ответ на Vadim Dvorovenko

Re: Задержка отправки личных сообщений в moodle

от Dmitriy Makarov -
Спасибо за подробный ответ! Очень помогло! Действительно проблема была в том, что рассылка велась через php. Просто поменял настройки smtp в moodle для обращения напрямую.