wp_schedule_event и летнее время - PullRequest
       11

wp_schedule_event и летнее время

0 голосов
/ 05 ноября 2018

Итак, сегодня утром я столкнулся с проблемой на веб-сайте, который использует WP Cron. Код выглядит так:

//Schedule the cron to run if not scheduled
if ( ! wp_next_scheduled( 'my_check_cron_event' ) ) {
    wp_schedule_event( strtotime('tomorrow America/New_York') , 'daily', 'my_check_cron_event' );
}

Проблема довольно проста. Этот код работает нормально, по сути, я хочу запускать функцию в полночь по местному времени, каждый день. Поэтому, когда я впервые запускаю функцию - она ​​получает метку времени завтрашней полуночи - местного времени. И с тех пор - работает functino.

Теперь в эти выходные - из-за перехода на летнее время функция фактически никогда не переключается на RESCHEDULED - она ​​просто запускается каждые 24 часа. Таким образом, функция начала работать в 11 вечера. Конечно, это легко исправить - но снова сломается. Я не могу найти хороших сообщений на эту тему - как бы вы справились:

wp_schedule_event работает ежедневно, когда меняется летнее время?

Просто чтобы выгрузить очевидные ответы здесь: я не могу запустить правильный cron - это нужно сделать через wp. Наш хост просто не поддерживает это, это отстой - но это клиент. Любой совет будет принята с благодарностью!

1 Ответ

0 голосов
/ 08 марта 2019

Так что для любого, кто сталкивался с этим, я должен был вернуться к этому для постоянного решения сегодня - поскольку Летнее время собирается измениться! Основная проблема здесь заключается в том, что wp_schedule_event - принимает параметр, количество секунд до следующего запуска. Этот параметр сохраняется в массиве cron - и ему действительно все равно, в каком часовом поясе вы находитесь. Он просто продолжает работать с этим интервалом. Чтобы это исправить - мне пришлось переключиться на wp_schedule_single_event.

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

if ( ! wp_next_scheduled( 'my_check_cron_event' ) ) {
   wp_schedule_single_event( strtotime('tomorrow America/New_York'), 'my_check_cron_event' );
}

Разница здесь в том, что strtotime () будет получать правильную временную метку каждый ДЕНЬ, что учитывает переход на летнее время, а не просто выполняется каждые 24 часа. Надеюсь, это кому-нибудь поможет!

...