function runcron($cronid = 0) { global $_SGLOBAL, $_SCONFIG, $_SBLOCK, $_TPL, $_SCOOKIE, $_SN, $space; $where = $cronid ? "cronid='{$cronid}'" : "available>'0' AND nextrun<='{$_SGLOBAL['timestamp']}'"; $query = $_SGLOBAL['db']->query("SELECT * FROM " . tname('cron') . " WHERE {$where} ORDER BY nextrun LIMIT 1"); //只运行一个 if ($cron = $_SGLOBAL['db']->fetch_array($query)) { $lockfile = S_ROOT . './data/runcron_' . $cron['cronid'] . '.lock'; $cronfile = S_ROOT . './source/cron/' . $cron['filename']; if (is_writable($lockfile)) { $locktime = filemtime($lockfile); if ($locktime > $_SGLOBAL['timestamp'] - 600) { //10分钟 return NULL; } } else { @touch($lockfile); } @set_time_limit(1000); @ignore_user_abort(TRUE); cronnextrun($cron); if (!@(include $cronfile)) { runlog('CRON', $cron['name'] . ' : Cron script(' . $cron['filename'] . ') not found or syntax error', 0); } @unlink($lockfile); } //更新config cron_config(); }
} //重新计算下次执行时间 cronnextrun($setarr); //更新config cron_config(); cpmessage('do_success', 'admincp.php?ac=cron'); } if ($_GET['op'] == 'edit') { $query = $_SGLOBAL['db']->query("SELECT * FROM " . tname('cron') . " WHERE cronid='{$cronid}'"); $thevalue = $_SGLOBAL['db']->fetch_array($query); } elseif ($_GET['op'] == 'add') { $thevalue = array('week' => '-1', 'hour' => '-1', 'day' => '-1', 'minute' => '0', 'available' => 1); } elseif ($_GET['op'] == 'delete') { $_SGLOBAL['db']->query("DELETE FROM " . tname('cron') . " WHERE cronid='{$cronid}' AND type='user'"); //更新缓存 cron_config(); cpmessage('do_success', 'admincp.php?ac=cron'); } elseif ($_GET['op'] == 'run') { runcron($cronid); cpmessage('do_success', 'admincp.php?ac=cron'); } else { //列表 $query = $_SGLOBAL['db']->query("SELECT * FROM " . tname('cron') . " ORDER BY type DESC"); while ($cron = $_SGLOBAL['db']->fetch_array($query)) { foreach (array('weekday', 'day', 'hour', 'minute') as $key) { if (in_array($cron[$key], array(-1, ''))) { $cron[$key] = '*'; } elseif ($key == 'weekday') { $cron[$key] = 1 + $cron[$key]; } elseif ($key == 'minute') { foreach ($cron[$key] = explode("\t", $cron[$key]) as $k => $v) {