Пример #1
0
function build_cron_item($cronid, $crondata = '')
{
    global $vbulletin;
    if (!is_array($crondata)) {
        $crondata = $vbulletin->db->query_first("\n\t\t\tSELECT *\n\t\t\tFROM " . TABLE_PREFIX . "cron\n\t\t\tWHERE cronid = " . intval($cronid));
    }
    $minutenow = intval(date('i', TIMENOW));
    $hournow = intval(date('H', TIMENOW));
    $daynow = intval(date('d', TIMENOW));
    $monthnow = intval(date('m', TIMENOW));
    $yearnow = intval(date('Y', TIMENOW));
    $weekdaynow = intval(date('w', TIMENOW));
    // ok need to work out, date and time of 1st and 2nd next opportunities to run
    if ($crondata['weekday'] == -1) {
        // any day of week:
        if ($crondata['day'] == -1) {
            // any day of month:
            $firstday = $daynow;
            $secondday = $daynow + 1;
        } else {
            // specific day of month:
            $firstday = $crondata['day'];
            $secondday = $crondata['day'] + date('t', TIMENOW);
            // number of days this month
        }
    } else {
        // specific day of week:
        $firstday = $daynow + ($crondata['weekday'] - $weekdaynow);
        $secondday = $firstday + 7;
    }
    if ($firstday < $daynow) {
        $firstday = $secondday;
    }
    if ($firstday == $daynow) {
        // next run is due today?
        $todaytime = fetch_cron_next_run($crondata);
        // see if possible to run again today
        if ($todaytime['hour'] == -1 and $todaytime['minute'] == -1) {
            // can't run today
            $crondata['day'] = $secondday;
            $newtime = fetch_cron_next_run($crondata, 0, -1);
            $crondata['hour'] = $newtime['hour'];
            $crondata['minute'] = $newtime['minute'];
        } else {
            $crondata['day'] = $firstday;
            $crondata['hour'] = $todaytime['hour'];
            $crondata['minute'] = $todaytime['minute'];
        }
    } else {
        $crondata['day'] = $firstday;
        $newtime = fetch_cron_next_run($crondata, 0, -1);
        // work out first run time that day
        $crondata['hour'] = $newtime['hour'];
        $crondata['minute'] = $newtime['minute'];
    }
    $nextrun = mktime($crondata['hour'], $crondata['minute'], 0, $monthnow, $crondata['day'], $yearnow);
    // save it
    $vbulletin->db->query_write("\n\t\tUPDATE " . TABLE_PREFIX . "cron\n\t\tSET nextrun = " . $nextrun . "\n\t\tWHERE cronid = " . intval($cronid) . " AND nextrun = " . $crondata['nextrun']);
    $not_run = $vbulletin->db->affected_rows() > 0;
    build_cron_next_run($nextrun);
    return iif($not_run, $nextrun, 0);
}
Пример #2
0
function build_cron_item($cronid, $crondata = '')
{
    if (!is_array($crondata)) {
        $crondata = vB::getDbAssertor()->getRow('cron', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_SELECT, 'cronid' => intval($cronid)));
    }
    $timenow = vB::getRequest()->getTimeNow();
    $minutenow = intval(date('i', $timenow));
    $hournow = intval(date('H', $timenow));
    $daynow = intval(date('d', $timenow));
    $monthnow = intval(date('m', $timenow));
    $yearnow = intval(date('Y', $timenow));
    $weekdaynow = intval(date('w', $timenow));
    // ok need to work out, date and time of 1st and 2nd next opportunities to run
    if ($crondata['weekday'] == -1) {
        // any day of week:
        if ($crondata['day'] == -1) {
            // any day of month:
            $firstday = $daynow;
            $secondday = $daynow + 1;
        } else {
            // specific day of month:
            $firstday = $crondata['day'];
            $secondday = $crondata['day'] + date('t', $timenow);
            // number of days this month
        }
    } else {
        // specific day of week:
        $firstday = $daynow + ($crondata['weekday'] - $weekdaynow);
        $secondday = $firstday + 7;
    }
    if ($firstday < $daynow) {
        $firstday = $secondday;
    }
    if ($firstday == $daynow) {
        // next run is due today?
        $todaytime = fetch_cron_next_run($crondata);
        // see if possible to run again today
        if ($todaytime['hour'] == -1 and $todaytime['minute'] == -1) {
            // can't run today
            $crondata['day'] = $secondday;
            $newtime = fetch_cron_next_run($crondata, 0, -1);
            $crondata['hour'] = $newtime['hour'];
            $crondata['minute'] = $newtime['minute'];
        } else {
            $crondata['day'] = $firstday;
            $crondata['hour'] = $todaytime['hour'];
            $crondata['minute'] = $todaytime['minute'];
        }
    } else {
        $crondata['day'] = $firstday;
        $newtime = fetch_cron_next_run($crondata, 0, -1);
        // work out first run time that day
        $crondata['hour'] = $newtime['hour'];
        $crondata['minute'] = $newtime['minute'];
    }
    $nextrun = mktime($crondata['hour'], $crondata['minute'], 0, $monthnow, $crondata['day'], $yearnow);
    // save it
    $affectedrows = vB::getDbAssertor()->assertQuery('cron', array(vB_dB_Query::TYPE_KEY => vB_dB_Query::QUERY_UPDATE, 'nextrun' => $nextrun, vB_dB_Query::CONDITIONS_KEY => array('cronid' => intval($cronid), 'nextrun' => $crondata['nextrun'])));
    $not_run = $affectedrows > 0;
    build_cron_next_run($nextrun);
    return iif($not_run, $nextrun, 0);
}