Cron и следующая дата выполнения

Статус
В этой теме нельзя размещать новые ответы.

savage[2]

Новичок
Cron и следующая дата выполнения

Господа помогите решить задачу. Пишу функцию, вида: cronNextTimeExe('0 * * * *');
Функция получает строку из crontab, разбирает ее и выдает ближайшее время запуска по указанной строке.
У меня есть ограничения накладываемые на входную строку. Ни каких интервалов все через запятую.
Т.е. строка вида "0 1-3 * * *" должна выглядеть так: "0 1,2,3 * * *"
Первое что я делаю - это разбиваю строку на пробелы получив необходимые числа для минут, часов, дней недели, и т.п.
Дальше... полная путаница из-за того что много различных если. Пока у меня получается получить последнюю дату задачи указанную в строке, а нужна следующая..... + еще не учтен день недели.
PHP:
function cronNextTimeExe($str)
{
        $symbol=Array('i','H','w','j','n');
    $cronSet=explode(' ',$str);
    $cronTime=Array();
    $tmpSet=Array();
    for($i=0; $i<sizeof($cronSet); $i++)
    {
        if($cronSet[$i]=='*') $cronTime[$i]=intval(date($symbol[$i]));
        elseif(strstr($cronSet[$i],','))
        {
            $tmpSet=explode(',',$cronSet[$i]);
            $curVal=intval(date($symbol[$i]));
            $cronTime[$i]=intval($tmpSet[0]);
            for($j=0; $j<sizeof($tmpSet); $j++)
            {
                if($curVal<intval($tmpSet[$j]))
                {
                    $cronTime[$i]=intval($tmpSet[$j]);
                    break;
                }
            }
        }
        else $cronTime[$i]=intval($cronSet[$i]);
    }
    return mktime($cronTime[1],$cronTime[0],0,$cronTime[4],$cronTime[3],date('Y'));
}
$time=cronNextTimeExe('0 * * * *');
print $str.'<br />'.$time.'<br />'.date('d.m.Y H:i:s',$time);
После некоторых поисков, я нашел вот этот класс:
http://www.phpclasses.org/browse/package/2568.html
Класс позволяет делать тоже самое, определить дату последнего исполнения команды указанной в строке даты.
Может кто знает как можно вычислить дату следующего исполнения.
 

AmdY

Пью пиво
Команда форума
мануал->функции работы с датой иначе постоянно придётся спрашивать.
 

savage[2]

Новичок
AmdY ты хочеш сказать что в PHP есть функция способная разобрать: '0 * * * *' ?
 

kruglov

Новичок
В PHP такой функции нет, но для таких случаев у программиста голова есть.

Которая может предложить, к примеру, такой вариант - сгенерить список всех запусков, отсортированный по возрастанию, найти первый, больший текущего времени.
 

savage[2]

Новичок
Да у меня это первое что в голову пришло - но в моем случае это не рационально.
Формат записи времени для Crontab - для меня идеально подходит.
 

kruglov

Новичок
Дык это, не понял, вы задачу решили что ли? Рационально?
 

savage[2]

Новичок
нет не решил. Так как ты предлагаешь я могу решить но меня для моей задачи не устраивает так как много данных придется обрабатывать.
Вот если бы была функция способная подобрать ближайшую дату по строке типа '0 * * * *' вот это было бы идеально.
 

kruglov

Новичок
Задача настолько экзотична, что функций готовых нету.
Хотя у меня такая задача была, правда, надо было вообще на календарике подсвечивать все будущие и прошлые запуски. Решил по-быстрому поминутным обходом суток со сравнением, а не подходит ли это время к маске. Не тормозило. Поскольку там у меня надо было находить все, а не ближайший, оптимизировать алгоритм было признано нецелесообразным.
 

savage[2]

Новичок
Понятно. Мне не подходит по той причине что таких дат у меня будет от 100 и больше, вполне вероятно что и 1 000 будет если я для каждой буду такого рода сравнения проводить - это будет накладно. А как ты по маске сравнение проводил?

P.S.: >Задача настолько экзотична, что функций готовых нету.
Согласен полностью
 

am-fm

Новичок
Всем привет!

Не нашлось ли решения для данной задачи?
 

zerkms

TDD infected
Команда форума
am-fm
мне - совершенно не слабо. в профиле есть контактная информация - я напишу специально для тебя эксклюзивную функцию, за 50 wmz.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху