elysia_cron_scheduler.inc 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. <?php
  2. /**
  3. * @file
  4. * Schedules cron runs.
  5. */
  6. /**
  7. * Function for cron run schedule.
  8. */
  9. function elysia_cron_should_run($conf, $now = -1, $ignore_disable = FALSE, $ignore_time = FALSE) {
  10. // What time SHOULD the job be executed last time.
  11. $prev_rule_run = 0;
  12. if (!$ignore_disable && $conf['disabled']) {
  13. return FALSE;
  14. }
  15. if ($ignore_time) {
  16. return TRUE;
  17. }
  18. if ($now < 0) {
  19. $now = time();
  20. }
  21. if ((!$conf['last_run']) || ($now - $conf['last_run'] > 365 * 86400)) {
  22. return TRUE;
  23. }
  24. $next_run = _elysia_cron_next_run($conf);
  25. return $now >= $next_run;
  26. }
  27. /**
  28. * Helper function for cron run schedule.
  29. */
  30. function _elysia_cron_next_run($conf) {
  31. if (!isset($conf['rule'])) {
  32. return FALSE;
  33. }
  34. $ranges = array(
  35. array(0, 59),
  36. array(0, 23),
  37. // TODO.
  38. array(1, 31),
  39. array(1, 12),
  40. array(0, 3000),
  41. array(0, 6),
  42. );
  43. if (!preg_match('/^([0-9*,\/-]+)[ ]+([0-9*,\/-]+)[ ]+([0-9*,\/-]+)[ ]+([0-9*,\/-]+)[ ]+([0-9*,\/-]+)$/', $conf['rule'], $rules)) {
  44. elysia_cron_warning('Invalid rule found: %rule', array('%rule' => $conf['rule']));
  45. return FALSE;
  46. }
  47. $rule = array($rules[1], $rules[2], array($rules[3], $rules[5]), $rules[4]);
  48. $ruledec = array();
  49. $date = __cronDecodeDate($conf['last_run'], 1);
  50. $expected_date = __cronDecodeDate(!empty($conf['last_run_expected']) ? $conf['last_run_expected'] : 0);
  51. for ($i = 0; $i < 4; $i++) {
  52. if ($i != 2) {
  53. // Standard scheme for mins, hours, month.
  54. $ruledec[$i] = __cronDecodeRule($rule[$i], $ranges[$i][0], $ranges[$i][1]);
  55. }
  56. else {
  57. // For mday+week we follow another scheme.
  58. $ruledec[$i] = __cronDecodeRuleMday($rule[2], $date[3], $date[4]);
  59. }
  60. $r = $ruledec[$i];
  61. $new = $date[$i];
  62. if ($r['d']) {
  63. if ($expected_date[$i] > $date[$i]) {
  64. $expected_date[$i] -= $ranges[$i][1] + 1;
  65. }
  66. $new = $expected_date[$i] + ceil(($date[$i] - $expected_date[$i]) / $r['d']) * $r['d'];
  67. }
  68. elseif ($r['n']) {
  69. $new = __cronNextOrEqual($date[$i], $r['n'], $ranges[$i][0], $ranges[$i][1]);
  70. }
  71. if ($new != $date[$i]) {
  72. $date[$i] = $new;
  73. if ($date[$i] > $ranges[$i][1]) {
  74. $date[$i + 1]++;
  75. $date[$i] = $ranges[$i][0] + $date[$i] - $ranges[$i][1] - 1;
  76. }
  77. for ($j = 0; $j < $i; $j++) {
  78. if ($j == 2) {
  79. // For mday+week decoded rule could be changed (by month+year)
  80. $ruledec[$j] = __cronDecodeRuleMday($rule[2], $date[3], $date[4]);
  81. }
  82. $date[$j] = $ruledec[$j]['d'] ? ($ranges[$j][0] == 0 ? 0 : $ruledec[$j]['d']) : ($ruledec[$j]['n'] ? reset($ruledec[$j]['n']) : $ranges[$j][0]);
  83. $expected_date[$j] = 0;
  84. }
  85. }
  86. }
  87. return __cronEncodeDate($date);
  88. }
  89. /**
  90. * Helper function for _elysia_cron_next_run().
  91. */
  92. function __cronDecodeDate($timestamp, $min_diff = 0) {
  93. $time = floor($timestamp / 60);
  94. $time += $min_diff;
  95. $date = $time ? getdate($time * 60) : 0;
  96. $date = array(
  97. $time ? $date['minutes'] : 0,
  98. $time ? $date['hours'] : 0,
  99. $time ? $date['mday'] : 0,
  100. $time ? $date['mon'] : 0,
  101. $time ? $date['year'] : 0,
  102. );
  103. return $date;
  104. }
  105. /**
  106. * Helper function for _elysia_cron_next_run().
  107. */
  108. function __cronEncodeDate($date) {
  109. return mktime($date[1], $date[0], 0, $date[3], $date[2], $date[4]);
  110. }
  111. /**
  112. * Helper function for _elysia_cron_next_run().
  113. */
  114. function __cronNextOrEqual($el, $arr, $range_start, $range_end) {
  115. if (empty($arr)) {
  116. return $el;
  117. }
  118. foreach ($arr as $x) {
  119. if ($x >= $el) {
  120. return $x;
  121. }
  122. }
  123. return $range_end + reset($arr) + 1 - $range_start;
  124. }
  125. /**
  126. * Helper function for _elysia_cron_next_run().
  127. */
  128. function __cronDecodeRule($rule, $min, $max) {
  129. if ($rule == '*') {
  130. return array('n' => array(), 'd' => 0);
  131. }
  132. $result = array('n' => array(), 'd' => 0);
  133. foreach (explode(',', $rule) as $token) {
  134. if (preg_match('/^([0-9]+)-([0-9]+)$/', $token, $r)) {
  135. $result['n'] = array_merge($result['n'], range($r[1], $r[2]));
  136. }
  137. elseif (preg_match('/^\*\/([0-9]+)$/', $token, $r)) {
  138. $result['d'] = $r[1];
  139. }
  140. elseif (is_numeric($token)) {
  141. $result['n'][] = $token;
  142. }
  143. }
  144. sort($result['n']);
  145. return $result;
  146. }
  147. /**
  148. * Helper function for _elysia_cron_next_run().
  149. */
  150. function __cronDecodeRuleMday($rule, $month, $year) {
  151. $range_from = 1;
  152. $range_to = $month != 2 ? (in_array($month, array(4, 6, 9, 11)) ? 30 : 31) : ($year % 4 == 0 ? 29 : 28);
  153. $r1 = __cronDecodeRule($rule[0], $range_from, $range_to);
  154. $r2 = __cronDecodeRule($rule[1], $range_from, $range_to);
  155. if ($r2['d']) {
  156. for ($i = 0; $i < 7; $i++) {
  157. if ($i % $r2['d'] == 0) {
  158. $r2['n'][] = $i;
  159. }
  160. }
  161. }
  162. if ($r2['n']) {
  163. $r2['n'] = array_unique($r2['n']);
  164. // Use always "31" and not $range_to, see http://drupal.org/node/1668302.
  165. $r1['n'] = array_merge($r1['n'], __cronMonDaysFromWeekDays($year, $month, $r2['n']), __cronMonDaysFromWeekDays($year, $month + 1, $r2['n'], 31));
  166. }
  167. return $r1;
  168. }
  169. /**
  170. * Helper function for _elysia_cron_next_run().
  171. */
  172. function __cronMonDaysFromWeekDays($year, $mon, $weekdays, $offset = 0) {
  173. if ($mon > 12) {
  174. $year++;
  175. $mon = $mon - 12;
  176. }
  177. $result = array();
  178. for ($i = 1; checkdate($mon, $i, $year); $i++) {
  179. $w = date('w', mktime(12, 00, 00, $mon, $i, $year));
  180. if (in_array($w, $weekdays)) {
  181. $result[] = $i + $offset;
  182. }
  183. }
  184. return $result;
  185. }
  186. /*******************************************************************************
  187. * TESTS
  188. ******************************************************************************/
  189. /**
  190. * Test function for elysia_cron_should_run().
  191. */
  192. function test_elysia_cron_should_run() {
  193. dprint("Start test");
  194. $start = microtime(TRUE);
  195. // @mktime: hr min sec mon day yr.
  196. dprint(" 1." . (FALSE == elysia_cron_should_run(array(
  197. 'rule' => '0 12 * * *',
  198. 'last_run' => mktime(12, 0, 0, 1, 2, 2008),
  199. ), mktime(12, 01, 0, 1, 2, 2008))));
  200. dprint(" 2." . (FALSE == elysia_cron_should_run(array(
  201. 'rule' => '0 12 * * *',
  202. 'last_run' => mktime(12, 0, 0, 1, 2, 2008),
  203. ), mktime(15, 00, 0, 1, 2, 2008))));
  204. dprint(" 3." . (FALSE == elysia_cron_should_run(array(
  205. 'rule' => '0 12 * * *',
  206. 'last_run' => mktime(12, 0, 0, 1, 2, 2008),
  207. ), mktime(11, 59, 0, 1, 3, 2008))));
  208. dprint(" 4." . (TRUE == elysia_cron_should_run(array(
  209. 'rule' => '0 12 * * *',
  210. 'last_run' => mktime(12, 0, 0, 1, 2, 2008),
  211. ), mktime(12, 00, 0, 1, 3, 2008))));
  212. dprint(" 5." . (FALSE == elysia_cron_should_run(array(
  213. 'rule' => '59 23 * * *',
  214. 'last_run' => mktime(23, 59, 0, 1, 2, 2008),
  215. ), mktime(0, 00, 0, 1, 3, 2008))));
  216. dprint(" 6." . (TRUE == elysia_cron_should_run(array(
  217. 'rule' => '59 23 * * *',
  218. 'last_run' => mktime(23, 59, 0, 1, 2, 2008),
  219. ), mktime(23, 59, 0, 1, 3, 2008))));
  220. dprint(" 7." . (TRUE == elysia_cron_should_run(array(
  221. 'rule' => '59 23 * * *',
  222. 'last_run' => mktime(23, 59, 0, 1, 2, 2008),
  223. ), mktime(0, 00, 0, 1, 4, 2008))));
  224. dprint(" 8." . (TRUE == elysia_cron_should_run(array(
  225. 'rule' => '59 23 * * *',
  226. 'last_run' => mktime(23, 58, 0, 1, 2, 2008),
  227. ), mktime(23, 59, 0, 1, 2, 2008))));
  228. dprint(" 9." . (TRUE == elysia_cron_should_run(array(
  229. 'rule' => '59 23 * * *',
  230. 'last_run' => mktime(23, 58, 0, 1, 2, 2008),
  231. ), mktime(0, 0, 0, 1, 3, 2008))));
  232. dprint("10." . (FALSE == elysia_cron_should_run(array(
  233. 'rule' => '59 23 * * 0',
  234. 'last_run' => mktime(23, 58, 0, 1, 5, 2008),
  235. ), mktime(23, 59, 0, 1, 5, 2008))));
  236. dprint("11." . (FALSE == elysia_cron_should_run(array(
  237. 'rule' => '59 23 * * 0',
  238. 'last_run' => mktime(23, 58, 0, 1, 5, 2008),
  239. ), mktime(0, 0, 0, 1, 6, 2008))));
  240. dprint("12." . (TRUE == elysia_cron_should_run(array(
  241. 'rule' => '59 23 * * 0',
  242. 'last_run' => mktime(23, 58, 0, 1, 5, 2008),
  243. ), mktime(23, 59, 0, 1, 6, 2008))));
  244. dprint("13." . (TRUE == elysia_cron_should_run(array(
  245. 'rule' => '59 23 * * 0',
  246. 'last_run' => mktime(23, 58, 0, 1, 5, 2008),
  247. ), mktime(00, 00, 0, 1, 7, 2008))));
  248. dprint("14." . (TRUE == elysia_cron_should_run(array(
  249. 'rule' => '29,59 23 * * 0',
  250. 'last_run' => mktime(23, 58, 0, 1, 5, 2008),
  251. ), mktime(23, 29, 0, 1, 6, 2008))));
  252. dprint("15." . (TRUE == elysia_cron_should_run(array(
  253. 'rule' => '29,59 23 * * 0',
  254. 'last_run' => mktime(23, 58, 0, 1, 5, 2008),
  255. ), mktime(23, 59, 0, 1, 6, 2008))));
  256. dprint("16." . (FALSE == elysia_cron_should_run(array(
  257. 'rule' => '29,59 23 * * 0',
  258. 'last_run' => mktime(23, 58, 0, 1, 5, 2008),
  259. ), mktime(23, 59, 0, 1, 5, 2008))));
  260. dprint("17." . (TRUE == elysia_cron_should_run(array(
  261. 'rule' => '29,59 23 * * 0',
  262. 'last_run' => mktime(23, 58, 0, 1, 5, 2008),
  263. ), mktime(23, 58, 0, 1, 6, 2008))));
  264. dprint("18." . (FALSE == elysia_cron_should_run(array(
  265. 'rule' => '29,59 23 * * 0',
  266. 'last_run' => mktime(23, 58, 0, 1, 5, 2008),
  267. ), mktime(23, 28, 0, 1, 6, 2008))));
  268. dprint("19." . (FALSE == elysia_cron_should_run(array(
  269. 'rule' => '29,59 23 * * 0',
  270. 'last_run' => mktime(23, 28, 0, 1, 5, 2008),
  271. ), mktime(23, 29, 0, 1, 5, 2008))));
  272. dprint("20." . (FALSE == elysia_cron_should_run(array(
  273. 'rule' => '29,59 23 * * 0',
  274. 'last_run' => mktime(23, 28, 0, 1, 5, 2008),
  275. ), mktime(23, 30, 0, 1, 5, 2008))));
  276. dprint("21." . (FALSE == elysia_cron_should_run(array(
  277. 'rule' => '29,59 23 * * 0',
  278. 'last_run' => mktime(23, 28, 0, 1, 5, 2008),
  279. ), mktime(23, 59, 0, 1, 5, 2008))));
  280. dprint("22." . (TRUE == elysia_cron_should_run(array(
  281. 'rule' => '29,59 23 * * 0',
  282. 'last_run' => mktime(23, 28, 0, 1, 5, 2008),
  283. ), mktime(23, 29, 0, 1, 6, 2008))));
  284. dprint("23." . (FALSE == elysia_cron_should_run(array(
  285. 'rule' => '29,59 23 * * 5',
  286. 'last_run' => mktime(23, 59, 0, 2, 22, 2008),
  287. ), mktime(23, 59, 0, 2, 28, 2008))));
  288. dprint("24." . (TRUE == elysia_cron_should_run(array(
  289. 'rule' => '29,59 23 * * 5',
  290. 'last_run' => mktime(23, 59, 0, 2, 22, 2008),
  291. ), mktime(23, 59, 0, 2, 29, 2008))));
  292. dprint("25." . (TRUE == elysia_cron_should_run(array(
  293. 'rule' => '29,59 23 * * 5',
  294. 'last_run' => mktime(23, 59, 0, 2, 22, 2008),
  295. ), mktime(0, 0, 0, 3, 1, 2008))));
  296. dprint("26." . (FALSE == elysia_cron_should_run(array(
  297. 'rule' => '59 23 * * 3',
  298. 'last_run' => mktime(23, 59, 0, 12, 31, 2008),
  299. ), mktime(0, 0, 0, 1, 1, 2009))));
  300. dprint("27." . (FALSE == elysia_cron_should_run(array(
  301. 'rule' => '59 23 * * 3',
  302. 'last_run' => mktime(23, 59, 0, 12, 31, 2008),
  303. ), mktime(0, 0, 0, 1, 7, 2009))));
  304. dprint("28." . (TRUE == elysia_cron_should_run(array(
  305. 'rule' => '59 23 * * 3',
  306. 'last_run' => mktime(23, 59, 0, 12, 31, 2008),
  307. ), mktime(23, 59, 0, 1, 7, 2009))));
  308. dprint("29." . (TRUE == elysia_cron_should_run(array(
  309. 'rule' => '59 23 * 2 5',
  310. 'last_run' => mktime(23, 59, 0, 2, 22, 2008),
  311. ), mktime(23, 59, 0, 2, 29, 2008))));
  312. dprint("30." . (TRUE == elysia_cron_should_run(array(
  313. 'rule' => '59 23 * 2 5',
  314. 'last_run' => mktime(23, 59, 0, 2, 22, 2008),
  315. ), mktime(0, 0, 0, 3, 1, 2008))));
  316. dprint("31." . (FALSE == elysia_cron_should_run(array(
  317. 'rule' => '59 23 * 2 5',
  318. 'last_run' => mktime(23, 59, 0, 2, 29, 2008),
  319. ), mktime(23, 59, 0, 3, 7, 2008))));
  320. dprint("32." . (FALSE == elysia_cron_should_run(array(
  321. 'rule' => '59 23 * 2 5',
  322. 'last_run' => mktime(23, 59, 0, 2, 29, 2008),
  323. ), mktime(23, 58, 0, 2, 6, 2009))));
  324. dprint("33." . (TRUE == elysia_cron_should_run(array(
  325. 'rule' => '59 23 * 2 5',
  326. 'last_run' => mktime(23, 59, 0, 2, 29, 2008),
  327. ), mktime(23, 59, 0, 2, 6, 2009))));
  328. dprint("34." . (TRUE == elysia_cron_should_run(array(
  329. 'rule' => '59 23 *' . '/10 * *',
  330. 'last_run' => mktime(23, 58, 0, 1, 10, 2008),
  331. ), mktime(23, 59, 0, 1, 10, 2008))));
  332. dprint("35." . (FALSE == elysia_cron_should_run(array(
  333. 'rule' => '59 23 *' . '/10 * *',
  334. 'last_run' => mktime(23, 59, 0, 1, 10, 2008),
  335. ), mktime(23, 59, 0, 1, 11, 2008))));
  336. dprint("36." . (TRUE == elysia_cron_should_run(array(
  337. 'rule' => '59 23 *' . '/10 * *',
  338. 'last_run' => mktime(23, 59, 0, 1, 10, 2008),
  339. ), mktime(23, 59, 0, 1, 20, 2008))));
  340. dprint("37." . (TRUE == elysia_cron_should_run(array(
  341. 'rule' => '59 23 1-5,10-15 * *',
  342. 'last_run' => mktime(23, 59, 0, 1, 4, 2008),
  343. ), mktime(23, 59, 0, 1, 5, 2008))));
  344. dprint("38." . (TRUE == elysia_cron_should_run(array(
  345. 'rule' => '59 23 1-5,10-15 * *',
  346. 'last_run' => mktime(23, 59, 0, 1, 4, 2008),
  347. ), mktime(23, 59, 0, 1, 6, 2008))));
  348. dprint("39." . (FALSE == elysia_cron_should_run(array(
  349. 'rule' => '59 23 1-5,10-15 * *',
  350. 'last_run' => mktime(23, 59, 0, 1, 5, 2008),
  351. ), mktime(23, 59, 0, 1, 6, 2008))));
  352. dprint("40." . (FALSE == elysia_cron_should_run(array(
  353. 'rule' => '59 23 1-5,10-15 * *',
  354. 'last_run' => mktime(23, 59, 0, 1, 5, 2008),
  355. ), mktime(23, 58, 0, 1, 10, 2008))));
  356. dprint("41." . (TRUE == elysia_cron_should_run(array(
  357. 'rule' => '59 23 1-5,10-15 * *',
  358. 'last_run' => mktime(23, 59, 0, 1, 5, 2008),
  359. ), mktime(23, 59, 0, 1, 10, 2008))));
  360. dprint("42." . (TRUE == elysia_cron_should_run(array(
  361. 'rule' => '59 23 1-5,10-15 * *',
  362. 'last_run' => mktime(23, 59, 0, 1, 5, 2008),
  363. ), mktime(23, 59, 0, 1, 16, 2008))));
  364. dprint("43." . (TRUE == elysia_cron_should_run(array(
  365. 'rule' => '59 23 1-5 1 0',
  366. 'last_run' => mktime(23, 59, 0, 1, 4, 2008),
  367. ), mktime(23, 59, 0, 1, 5, 2008))));
  368. dprint("44." . (TRUE == elysia_cron_should_run(array(
  369. 'rule' => '59 23 1-5 1 0',
  370. 'last_run' => mktime(23, 59, 0, 1, 5, 2008),
  371. ), mktime(23, 59, 0, 1, 6, 2008))));
  372. dprint("45." . (FALSE == elysia_cron_should_run(array(
  373. 'rule' => '59 23 1-5 1 0',
  374. 'last_run' => mktime(23, 59, 0, 1, 6, 2008),
  375. ), mktime(23, 59, 0, 1, 7, 2008))));
  376. dprint("46." . (TRUE == elysia_cron_should_run(array(
  377. 'rule' => '59 23 1-5 1 0',
  378. 'last_run' => mktime(23, 59, 0, 1, 6, 2008),
  379. ), mktime(23, 59, 0, 1, 13, 2008))));
  380. dprint("47." . (FALSE == elysia_cron_should_run(array(
  381. 'rule' => '59 23 1-5 1 0',
  382. 'last_run' => mktime(23, 59, 0, 2, 4, 2008),
  383. ), mktime(23, 59, 0, 2, 5, 2008))));
  384. dprint("48." . (FALSE == elysia_cron_should_run(array(
  385. 'rule' => '59 23 1-5 1 0',
  386. 'last_run' => mktime(23, 59, 0, 2, 5, 2008),
  387. ), mktime(23, 59, 0, 2, 10, 2008))));
  388. dprint("49." . (FALSE == elysia_cron_should_run(array(
  389. 'rule' => '59 23 1-5 1 0',
  390. 'last_run' => mktime(23, 59, 0, 2, 10, 2008),
  391. ), mktime(23, 59, 0, 2, 17, 2008))));
  392. dprint("49." . (TRUE == elysia_cron_should_run(array(
  393. 'rule' => '* 0,1,2,3,4,5,6,7,8,18,19,20,21,22,23 * * *',
  394. 'last_run' => mktime(8, 58, 0, 2, 10, 2008),
  395. ), mktime(8, 59, 0, 2, 10, 2008))));
  396. dprint("50." . (FALSE == elysia_cron_should_run(array(
  397. 'rule' => '* 0,1,2,3,4,5,6,7,8,18,19,20,21,22,23 * * *',
  398. 'last_run' => mktime(8, 59, 0, 2, 10, 2008),
  399. ), mktime(9, 00, 0, 2, 10, 2008))));
  400. dprint("51." . (FALSE == elysia_cron_should_run(array(
  401. 'rule' => '* 0,1,2,3,4,5,6,7,8,18,19,20,21,22,23 * * *',
  402. 'last_run' => mktime(8, 59, 0, 2, 10, 2008),
  403. ), mktime(17, 59, 0, 2, 10, 2008))));
  404. dprint("52." . (TRUE == elysia_cron_should_run(array(
  405. 'rule' => '* 0,1,2,3,4,5,6,7,8,18,19,20,21,22,23 * * *',
  406. 'last_run' => mktime(8, 59, 0, 2, 10, 2008),
  407. ), mktime(18, 00, 0, 2, 10, 2008))));
  408. dprint("53." . (TRUE == elysia_cron_should_run(array(
  409. 'rule' => '* 0,1,2,3,4,5,6,7,8,18,19,20,21,22,23 * * *',
  410. 'last_run' => mktime(18, 00, 0, 2, 10, 2008),
  411. ), mktime(18, 01, 0, 2, 10, 2008))));
  412. dprint("54." . (TRUE == elysia_cron_should_run(array(
  413. 'rule' => '* 0,1,2,3,4,5,6,7,8,18,19,20,21,22,23 * * *',
  414. 'last_run' => mktime(18, 00, 0, 2, 10, 2008),
  415. ), mktime(19, 0, 0, 2, 10, 2008))));
  416. dprint("55." . (TRUE == elysia_cron_should_run(array(
  417. 'rule' => '* 0,1,2,3,4,5,6,7,8,18,19,20,21,22,23 * * *',
  418. 'last_run' => mktime(18, 00, 0, 2, 10, 2008),
  419. ), mktime(9, 0, 0, 3, 10, 2008))));
  420. dprint("56." . (TRUE == elysia_cron_should_run(array(
  421. 'rule' => '* * * * *',
  422. 'last_run' => mktime(18, 00, 0, 2, 10, 2008),
  423. ), mktime(18, 01, 0, 2, 10, 2008))));
  424. dprint("End test (" . (microtime(TRUE) - $start) . ")");
  425. }
  426. // Remove comment to run tests.
  427. // test_elysia_cron_should_run();die();