Выполнять каждые 30 дней

180
17 ноября 2019, 01:50

Нужно сделать запуск скрипта каждые 30 дней (или каждый месяц) от определенной даты. Даты берутся из бд, их много и они разные.

Допустим у нас есть дата: 10.01.19, нужно что-бы скрипт срабатывал через каждые 30 дней. Т.е. 09.02.19, 11.03.19, 10.03.19 и т.д.

Придумал только это:

$now = time();
$save_date = strtotime($update_date);
$date_diff = $now - $save_date;
$datefloor = floor($date_diff / (60 * 60 * 24));
if($datefloor >= 30){
  echo 'ok';
}

Но так скрипт будет выполнятся только 1 раз, т.е. совсем не то что нужно. Подскажите, пожалуйста, какие-то варианты реализации.

Answer 1

Вот мой вариант функции (вместо вашей), которая делает то, что вы пытались реализовать.

Она по параметрам определенная дата из бд, интервал и текущая дата определяет - пора или нет запускать некую обработку:

<?php
/**
 * Делятся ли без остатка кол-во дней в периоде на количество дней интервала
 *
 * @param $start DateTime начало периода
 * @param $days int интервал, в днях
 * @param $now DateTime конец периода
 * @return boolean
 */
function isDue(DateTime $start, $days = 30, DateTime $now = null)
{
    $now = $now === null? new DateTime("now"): $now;
    return $now->diff($start)->format("%a") % $days === 0;
}

Вот примеры ее использования:

/
// тесты
//
echo (int)isDue(
    DateTime::createFromFormat("d.m.y", "10.01.19"),
    30,
    DateTime::createFromFormat("d.m.y", "08.02.19")
); // --> 0
echo (int)isDue(
    DateTime::createFromFormat("d.m.y", "10.01.19"),
    30,
    DateTime::createFromFormat("d.m.y", "09.02.19")
); // --> 1
echo (int)isDue(
    DateTime::createFromFormat("d.m.y", "10.01.19"),
    30,
    DateTime::createFromFormat("d.m.y", "10.03.19")
); // --> 0
echo (int)isDue(
    DateTime::createFromFormat("d.m.y", "10.01.19"),
    30,
    DateTime::createFromFormat("d.m.y", "11.03.19")
); // --> 1
echo (int)isDue(
    DateTime::createFromFormat("d.m.y", "10.01.19"),
    30,
    DateTime::createFromFormat("d.m.y", "09.04.19")
); // --> 0
echo (int)isDue(
    DateTime::createFromFormat("d.m.y", "10.01.19"),
    30,
    DateTime::createFromFormat("d.m.y", "10.04.19")
); // --> 1

Песочница

READ ALSO
Хранение данных в session или cookies

Хранение данных в session или cookies

При авторизации я записываю логин в сессиюУ меня в БД есть столбец с числами от 0 включительно

170
Как взять значение поля &ldquo;Имя&rdquo; из контактной формы и вставить его в HTML thank you page

Как взять значение поля “Имя” из контактной формы и вставить его в HTML thank you page

Я прошу прощение за глупый вопросОткровенно запостил его, чтобы быстрее найти ответ

181
Диалог и показ не прочитанных сообщений php

Диалог и показ не прочитанных сообщений php

Имеется данный код, нужно чтобы этот код возвращал не прочитанные сообщения yeld не прочитанное сообщениеНа данный момент выводит непрочитанные...

172
Метод PUT в форме html

Метод PUT в форме html

Есть страница, сверстанная на bootstrap'еНа ней есть форма для редактирования пользователя, но при нажатии на кнопку "Сохранить" возникает ошибка...

140