Предотвращение бесконечного цикла AJAX при использовании собственного APIPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Предотвращение бесконечного цикла AJAX при использовании собственного API

Сообщение Anonymous »

В настоящее время я пытаюсь выяснить интеграцию между двумя плагинами Wordpress: плагином WooCommerce Follow Up Emails и плагином Ninja Forms (с конечной целью, чтобы мы могли отправлять шаблон последующего электронного письма ручного типа в качестве действия в ответ на ниндзя формирует представление). Мы используем Ninja Forms 3, чего бы это ни стоило.

При определении параметров класса Action я предоставляю пользователю список шаблонов, чтобы при определяя действие, они могут выбрать шаблон для отправки. Чтобы получить шаблоны электронных писем из плагина последующих писем, я использую их API-клиент, а именно метод get_emails() (который, в свою очередь, преобразуется в вызов GET к конечной точке /emails в разделе их URL-адрес API).

Проблема в следующем: при каждой загрузке страницы вызывается действие ninja_forms_register_actions, во время которого я создаю экземпляр своего класса действия. Во время вызова __construct мы заполняем настройки действия и для этого вызываем API Follow Up Emails. Это инициирует загрузку страницы, во время которой вызывается действие ninja_forms_register_actions...

Хотя я предвидел эту проблему, мое запланированное решение не помогло: это то есть я планировал использовать переходные процессы для хранения результата вызова API, вот так:

Код: Выделить всё

private static function _get_templates()
{
error_log('_get_templates() started - ' . microtime(true));
if (false === ($templates = get_transient(self::TEMPLATE_TRANSIENT))) {
error_log('_get_templates() fetching - ' . microtime(true));
$fue_api = self::fue_api();
$templates = $fue_api->get_emails();
set_transient(self::TEMPLATE_TRANSIENT, $templates, self::TEMPLATE_TRANSIENT_EXPIRY);
error_log('_get_templates() fetched - ' . microtime(true));
}
error_log('_get_templates() done - ' . microtime(true));

return $templates;
}
Однако результат в моих журналах следующий:

Код: Выделить всё

[22-May-2016 23:53:33 UTC] _get_templates() started - 1463961213.692187
[22-May-2016 23:53:33 UTC] _get_templates() fetching - 1463961213.694222
[22-May-2016 23:53:34 UTC] _get_templates() started - 1463961214.05998
[22-May-2016 23:53:34 UTC] _get_templates() fetching - 1463961214.061054
[22-May-2016 23:53:38 UTC] _get_templates() started - 1463961218.660683
[22-May-2016 23:53:38 UTC] _get_templates() fetching - 1463961218.661265
[22-May-2016 23:53:40 UTC] _get_templates() started - 1463961220.772228
[22-May-2016 23:53:40 UTC] _get_templates() fetching - 1463961220.774142
[22-May-2016 23:53:41 UTC] _get_templates() started - 1463961221.150277
[22-May-2016 23:53:41 UTC] _get_templates() fetching - 1463961221.654757
[22-May-2016 23:53:45 UTC] _get_templates() started - 1463961225.306565
[22-May-2016 23:53:45 UTC] _get_templates() fetching - 1463961225.308898
[22-May-2016 23:53:46 UTC] _get_templates() started - 1463961226.281794
[22-May-2016 23:53:46 UTC] _get_templates() fetching - 1463961226.283803
Это продолжается до тех пор, пока я не остановлю процесс веб-сервера или не сделаю что-нибудь еще радикальное, например, удалив/переименовав папку плагина, после чего переходный процесс заполняется кодом ошибки HTTP (который само по себе неудивительно). Итак, очевидно, что мое переходное решение не работает, поскольку переходный процесс все еще не установлен до тех пор, пока не будет выполнен запрос.

В некоторых подобных ситуациях я бы добавил проверку на DOING_AJAX, однако это не подходит по двум причинам: мне все еще нужно, чтобы эти данные были доступны процессам AJAX Ninja Forms, а также я не уверен, действительно ли здесь будет установлен DOING_AJAX, поскольку API FUE не использует admin-ajax.php. Я подумывал о переходе на что-то вроде следующего:

Код: Выделить всё

private static function _get_templates()
{
error_log('_get_templates() started - ' . microtime(true));
if (false === get_option(self::TEMPLATE_LOCK_OPTION, false) && false === ($templates = get_transient(self::TEMPLATE_TRANSIENT))) {
delete_option(self::TEMPLATE_LOCK_OPTION);
add_option(self::TEMPLATE_LOCK_OPTION, true, '', 'no');
error_log('_get_templates() fetching - ' . microtime(true));
$fue_api = self::fue_api();
$templates = $fue_api->get_emails();
delete_option(self::TEMPLATE_LOCK_OPTION);
set_transient(self::TEMPLATE_TRANSIENT, $templates, self::TEMPLATE_TRANSIENT_EXPIRY);
error_log('_get_templates() fetched - ' .  microtime(true));
}
error_log('_get_templates() done - ' . microtime(true));

return $templates;
}
Но использование опций в качестве блокировок кажется грязным и неправильным, и мне кажется, что это оставляет место для ошибок при использовании кэширования объектов (например, WPEngine и др.). Есть ли лучший/нормальный способ справиться с этим или, наоборот, нет ли реальной проблемы с вышеизложенным?

Редактировать: Таким образом, решение для блокировки не работает И 100% — в итоге я сделал это с помощью задания WP Cron — каждые десять минут мы извлекаем список шаблонов, а не по мере необходимости, и сохраняем его в опции. Мне это решение не особенно нравится, но лучшего я пока придумать не смог. Все еще интересно, есть ли общее решение этой проблемы.

Подробнее здесь: https://stackoverflow.com/questions/373 ... ng-own-api
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Промывка потока останавливает его от бесконечного цикла? [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    40 Просмотры
    Последнее сообщение Anonymous
  • Создание бесконечного цикла карусели с использованием встроенного JavaScript, CSS и HTML.
    Гость » » в форуме CSS
    0 Ответы
    31 Просмотры
    Последнее сообщение Гость
  • PHP избегает бесконечного цикла while для непрерывной обработки
    Anonymous » » в форуме Php
    0 Ответы
    45 Просмотры
    Последнее сообщение Anonymous
  • PHP избегает бесконечного цикла while для непрерывной обработки
    Anonymous » » в форуме Php
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Получите обе стороны без циклического бесконечного цикла
    Anonymous » » в форуме JAVA
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Php»