WP cron: когда следует запланировать 1-кратное мероприятие


У меня есть пользовательский тип записи ('my_cpt'), и после save_post_my_cpt мне, возможно, потребуется внести большое количество изменений в другие записи (в зависимости от состояния записи, например, post_status, значения post_meta и термины из пользовательской таксономии). Эти другие изменения, возможно, потребуется внести в другие блоги на нескольких сайтах. Следовательно, выполнение функции, вызываемой в save_post_my_cpt, может занять до минуты или около того...что не очень "удобно" для пользователя-администратора, выполняющего изменения в содержании.

Я настраиваю все так, чтобы эти другие изменения происходили через WP Cron. Итак, у меня есть:

add_action ('save_post_my_cpt', 'save_cpt') ;

function
save_cpt ($post_id)
{
    if (defined ('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return ;
        }

    // do stuff related to saving post meta, etc
    // e.g., update_post_meta ($post_id, '_some_meta_name', $_REQUEST['some_meta_name'], true) ;

    // schedule an event to do the modifications of other posts
    // see below for question related to the time this cron job will be scheduled
    $time = time () ;
    wp_schedule_single_event ($time, 'my_cron_hook', array ($post_id)) ;

    return ;
}

add_action ('my_cron_hook', 'cron_func') ;

function
cron_func ($post_id)
{
    $post = get_post ($post_id) ;

    // get_blogs_that_might_need_to_be_modified() returns an array of blog_id's that
    // MIGHT have other posts related to $post that need to be modified

    // get_posts_in_that_blog_that_need_to_be_modified() returns an array of posts
    // related to $post that need to be modified

    // modify_post() returns a modified version of a related post based on the
    // current state of $post

    // the details of these functions aren't relevant to this question
    foreach (get_blogs_that_might_need_to_be_modified ($post) as $blog_id) {
        switch_to_blog ($blog_id) ;

        foreach (get_posts_in_that_blog_that_need_to_be_modified ($post) as $other_post) {
            $other_post = modify_post ($post) ;
            wp_update_post ($other_post) ;
            }

        restore_current_blog () ;
        }
}

Надеюсь, все будут со мной до этого момента. Мой вопрос связан со временем, на которое я должен запланировать это задание 1 раз.

Если я запланирую выполнение задания cron "немедленно" (как в приведенном выше коде), могу ли я быть уверен, что к моменту вызова cron_func() ВСЕ обновления БД, связанные с сохранением моего CPT, будут завершены (с момента функции, вызываемые в cron_func(), должны будут считывать измененное состояние $post_id)?

Планирование события для запуска "немедленно", похоже, отлично работает в моей локальной среде разработки (где я единственный, кто посещает сайт).

Мне интересно, возникнут ли у меня какие-либо проблемы с этим способом, когда сайт работает в рабочей среде с интенсивной активностью (т.Е. С несколькими пользователями-администраторами, одновременно редактирующими контент на серверной части, в то время как достаточное количество конечных пользователей попадание в передний конец)

Я рассматриваю две альтернативы:

  1. добавить некоторое смещение к time() при планировании события?
    1. например, запланируйте его запуск на 1 минуту позже
    2. если мне нужно это сделать, любые предположения о том, как долго мне следует ждать
  2. соберите всю необходимую мне информацию в save_cpt() и передайте ее в $args в wp_schedule_single_event()
    1. Я бы предпочел не идти этим путем, так как сбор этой информации сам по себе может занять некоторое время, что замедлит проблемы для пользователя-администратора
    2. есть ли "расходы" (т.Е. Память/и т.д.) При передаче большого объема информации на задание через cron?

Есть ли какие-либо другие соображения, которые я должен учитывать? Например, что, скорее всего, произойдет, когда:

  1. администратор пользователь A редактирует сообщение X, в котором запланировано задание cron
  2. прежде чем это задание cron завершится, администратор пользователь B внесет еще одно изменение в публикацию X
Author: Paul 'Sparrow Hawk' Biron, 2017-03-05

1 answers

Если я запланирую выполнение задания cron "немедленно" (как в приведенном выше коде), могу ли я быть уверен, что к моменту вызова cron_func() это ВСЕ обновления БД, связанные с сохранением моего CPT, будут завершены (поскольку функции, вызываемые в cron_func(), должны будут прочитать измененное состояние $post_id)

Да. save_post крючок срабатывает после того, как сообщение было фактически сохранено. Таким образом, cron_func получит измененное состояние сообщения. Вам не нужна никакая альтернатива для этот.

Есть ли какие-либо другие соображения, которые я должен учитывать? Например, что, скорее всего, произойдет, когда:

  1. администратор пользователь A редактирует сообщение X, которое планирует выполнение задания cron до завершения этого задания cron,
  2. администратор пользователь B вносит еще одно изменение в публикацию X

Если выполнение задания cron займет некоторое время, очень возможно столкнуться с такой проблемой. Чтобы решить эту проблему, вы можете поднять флаг (это может быть мета-сообщение) при создании задачу cron и снимите флажок, когда задача cron завершится. Возможно, вам захочется отключить редактирование записи, пока для записи установлен флажок.

 1
Author: sakibmoon, 2017-03-05 21:22:13