Поддержка Проблемы и решения Долгое выполнение команды в WordPress

  • Уважаемые специалисты, такой вот вопрос.

    Есть плагин для голосования с помощью 5 звезд, называется WP-postratings

    Я добавил (между 547 и 548 строчкой) в файл wp-postratings.php проверку при голосовании за 2 и менее звезду из 5. Вот код:

    if($rate < 2) {
                    printf(__('<span style="color:red"><strong>текст с просьбой уточнить почему такая низкая оценка</strong></span>'), $post_id);
              $emails_ntl = get_option('admin_email');
              $title_ntl = wp_strip_all_tags(get_the_title($post_id));
              $url_ntl = get_permalink($post_id);
              $message_ntl = "\n\nСсылка на пост {$url_ntl}\n\n Оценка {$rate}";
              wp_mail($emails_ntl, "Оповещение о оценке «{$title_ntl}»", $message_ntl);
                    exit();
                }

    Ситуация такая: если убрать wp_mail, то текстовое сообщение (которое «текст с просьбой уточнить почему такая низкая оценка») выводится на странице моментально при голосовании. А если добавить wp_mail, то с существенной задержкой, где-то полторы секунды выводится текстовое сообщение на странице. Как убрать эту задержку?

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Модератор Yuri

    (@yube)

    wp_mail может тормозить если
    1. на сервере специально установлена задержка на отправку почты. Помнится, где-то было чуть ли не 10 секунд. Типа борьбы с рассылкой спама. В принципе, это ловится простым php-скриптом с вызовом mail().
    2. если используется smtp, и на той стороне никто никуда не спешит. Ловится более сложным скриптом (из-за необходимости подключения движка) с вызовом wp_mail().

    Способ лечения зависит от диагноза.

    Юрий

    Спасибо, что откликнулись. Проблема не в задержке отправки почты, а в задержке показа сообщения <span style="color:red"><strong>текст с просьбой уточнить почему такая низкая оценка</strong></span> посетителю сайта. Задержка в полторы секунды — очень много.

    Если убрать строчку, отвечающую за отправку оповещения по электронной почте, то приведённое выше сообщение показывается моментально.

    Как сделать так, чтобы оно показывалось моментально, но при этом ещё и отправлялось оповещение по электронной почте?

    • Ответ изменён 4 года, 4 месяца назад пользователем ikiterder.
    Модератор Yuri

    (@yube)

    php однопоточный синхронный язык, то есть, пока один оператор/функция не завершится, следующий выполняться не будет. Можно попробовать сбросить буффер (flush()) до отправки письма, но я бы не рассчитывал, что это реально будет всегда работать.

    Возможно, php7.* уже предоставляют какие-то возможности форка или асинхронного выполнеия субпрограмм, я не знаю. Кто разбирался, пусть подскажет.

    Модератор Yui

    (@fierevere)

    永子

    pcntl, но, весьма ограниченно и для контекста вебсервера это реально на практике не применяется, мне не попадалось.

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Тема «Долгое выполнение команды в WordPress» закрыта для новых ответов.