@IvanKalinin

Как в WP асинхронно выполнять функцию (после отправки пользователю шаблона)?

Всем доброго времени.

Подкажите, как в WP можно выполнять функции асинхронно не заставляя пользователя ждать ее выполнения?

В 2х словах. От удаленного сервера получаю массив с ~50 объектами (периодически он меняется), которые содержат ссылки на изображения. Изображения очень большие, поэтому при первом получении массива хочу в фоне скачивать изображения на сервер, уменьшать их размер и вставлять в шаблон их уменьшенную копию, для более быстрой загрузки страницы конечному пользователю.

Пытался сделать примерно так
function cache_images() {
  //скачивание, уменьшение размера изображений 
}

add_action('cache_images', 'cache_images', 10, 1);

function render_template() {
 // получение массива
 // если (еще) нет сохраненных изображений
 // вставляю оригинальные
 // собственно тут и строится шаблон
  wp_schedule_single_event(time(), 'cache_images', $listings); 
}

По какой-то причине wp_schedule_single_event не выполняет функцию cache_images. Более того wp_next_scheduled('cache_images') всегда возвращает false. Пытался так же поиграть со временем, например time() + 3600 . Результат тот же. false

Если использовать вместо нее функцию register_shutdown_function( 'cache_images', $listings) или do_action('cache_images', $listings); То она пользователю приходится ждать пока на сервер загрузятся все ~50 изображений.

Собственно, снова вопрос:
Как отдать пользователю шаблон как есть (с оригинальными изображениями) и в фоне сохранить изображения.
  • Вопрос задан
  • 250 просмотров
Решения вопроса 2
OtshelnikFm
@OtshelnikFm Куратор тега WordPress
Обо мне расскажет yawncato.com
По крону. Получаете, загоняете в кеш.

Вообще получать по http и сразу отдавать - не лучшая идея. Делайте через транзитные кеши https://wp-kama.ru/id_6462/wordpress-http-api.html
Ответ написан
@IvanKalinin Автор вопроса
Я пошел немного другим путем.
В файле, который генерирует шаблон в конец добавил такой код:
<?php
function print_inline_js() {
?>
<script type="text/javascript">
  jQuery(document).ready(function($){
    $.get("<?php echo get_template_directory_uri(); ?>/cache_images.php");
  });
</script>
<?php
}
add_action( 'wp_footer', 'print_inline_js' );


Когда пользователь загружает страницу она посылает GET запрос к файлу cache_images.php с моментальным пустым ответом

в котором

<?php

class Cache_images {
  public function cache_images() {
    // прерывание запроса
    fastcgi_finish_request();
    // Далее код получения, уменьшения, сохранения изображений на мой сервер, который никак не отражается на ожидании конечного пользователя
}

$instance = new Cache_images();
$instance->cache_images();


В итоге все работает красиво и без ожиданий для все пользователей, даже для которых попали на кеширование. (им сразу отдается оригинальное изображение)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы