IntervalTrait.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. <?php
  2. /**
  3. * @package Grav\Common\Scheduler
  4. * @author Originally based on peppeocchi/php-cron-scheduler modified for Grav integration
  5. * @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. namespace Grav\Common\Scheduler;
  9. use Cron\CronExpression;
  10. use InvalidArgumentException;
  11. use function is_string;
  12. /**
  13. * Trait IntervalTrait
  14. * @package Grav\Common\Scheduler
  15. */
  16. trait IntervalTrait
  17. {
  18. /**
  19. * Set the Job execution time.
  20. *compo
  21. * @param string $expression
  22. * @return self
  23. */
  24. public function at($expression)
  25. {
  26. $this->at = $expression;
  27. $this->executionTime = CronExpression::factory($expression);
  28. return $this;
  29. }
  30. /**
  31. * Set the execution time to every minute.
  32. *
  33. * @return self
  34. */
  35. public function everyMinute()
  36. {
  37. return $this->at('* * * * *');
  38. }
  39. /**
  40. * Set the execution time to every hour.
  41. *
  42. * @param int|string $minute
  43. * @return self
  44. */
  45. public function hourly($minute = 0)
  46. {
  47. $c = $this->validateCronSequence($minute);
  48. return $this->at("{$c['minute']} * * * *");
  49. }
  50. /**
  51. * Set the execution time to once a day.
  52. *
  53. * @param int|string $hour
  54. * @param int|string $minute
  55. * @return self
  56. */
  57. public function daily($hour = 0, $minute = 0)
  58. {
  59. if (is_string($hour)) {
  60. $parts = explode(':', $hour);
  61. $hour = $parts[0];
  62. $minute = $parts[1] ?? '0';
  63. }
  64. $c = $this->validateCronSequence($minute, $hour);
  65. return $this->at("{$c['minute']} {$c['hour']} * * *");
  66. }
  67. /**
  68. * Set the execution time to once a week.
  69. *
  70. * @param int|string $weekday
  71. * @param int|string $hour
  72. * @param int|string $minute
  73. * @return self
  74. */
  75. public function weekly($weekday = 0, $hour = 0, $minute = 0)
  76. {
  77. if (is_string($hour)) {
  78. $parts = explode(':', $hour);
  79. $hour = $parts[0];
  80. $minute = $parts[1] ?? '0';
  81. }
  82. $c = $this->validateCronSequence($minute, $hour, null, null, $weekday);
  83. return $this->at("{$c['minute']} {$c['hour']} * * {$c['weekday']}");
  84. }
  85. /**
  86. * Set the execution time to once a month.
  87. *
  88. * @param int|string $month
  89. * @param int|string $day
  90. * @param int|string $hour
  91. * @param int|string $minute
  92. * @return self
  93. */
  94. public function monthly($month = '*', $day = 1, $hour = 0, $minute = 0)
  95. {
  96. if (is_string($hour)) {
  97. $parts = explode(':', $hour);
  98. $hour = $parts[0];
  99. $minute = $parts[1] ?? '0';
  100. }
  101. $c = $this->validateCronSequence($minute, $hour, $day, $month);
  102. return $this->at("{$c['minute']} {$c['hour']} {$c['day']} {$c['month']} *");
  103. }
  104. /**
  105. * Set the execution time to every Sunday.
  106. *
  107. * @param int|string $hour
  108. * @param int|string $minute
  109. * @return self
  110. */
  111. public function sunday($hour = 0, $minute = 0)
  112. {
  113. return $this->weekly(0, $hour, $minute);
  114. }
  115. /**
  116. * Set the execution time to every Monday.
  117. *
  118. * @param int|string $hour
  119. * @param int|string $minute
  120. * @return self
  121. */
  122. public function monday($hour = 0, $minute = 0)
  123. {
  124. return $this->weekly(1, $hour, $minute);
  125. }
  126. /**
  127. * Set the execution time to every Tuesday.
  128. *
  129. * @param int|string $hour
  130. * @param int|string $minute
  131. * @return self
  132. */
  133. public function tuesday($hour = 0, $minute = 0)
  134. {
  135. return $this->weekly(2, $hour, $minute);
  136. }
  137. /**
  138. * Set the execution time to every Wednesday.
  139. *
  140. * @param int|string $hour
  141. * @param int|string $minute
  142. * @return self
  143. */
  144. public function wednesday($hour = 0, $minute = 0)
  145. {
  146. return $this->weekly(3, $hour, $minute);
  147. }
  148. /**
  149. * Set the execution time to every Thursday.
  150. *
  151. * @param int|string $hour
  152. * @param int|string $minute
  153. * @return self
  154. */
  155. public function thursday($hour = 0, $minute = 0)
  156. {
  157. return $this->weekly(4, $hour, $minute);
  158. }
  159. /**
  160. * Set the execution time to every Friday.
  161. *
  162. * @param int|string $hour
  163. * @param int|string $minute
  164. * @return self
  165. */
  166. public function friday($hour = 0, $minute = 0)
  167. {
  168. return $this->weekly(5, $hour, $minute);
  169. }
  170. /**
  171. * Set the execution time to every Saturday.
  172. *
  173. * @param int|string $hour
  174. * @param int|string $minute
  175. * @return self
  176. */
  177. public function saturday($hour = 0, $minute = 0)
  178. {
  179. return $this->weekly(6, $hour, $minute);
  180. }
  181. /**
  182. * Set the execution time to every January.
  183. *
  184. * @param int|string $day
  185. * @param int|string $hour
  186. * @param int|string $minute
  187. * @return self
  188. */
  189. public function january($day = 1, $hour = 0, $minute = 0)
  190. {
  191. return $this->monthly(1, $day, $hour, $minute);
  192. }
  193. /**
  194. * Set the execution time to every February.
  195. *
  196. * @param int|string $day
  197. * @param int|string $hour
  198. * @param int|string $minute
  199. * @return self
  200. */
  201. public function february($day = 1, $hour = 0, $minute = 0)
  202. {
  203. return $this->monthly(2, $day, $hour, $minute);
  204. }
  205. /**
  206. * Set the execution time to every March.
  207. *
  208. * @param int|string $day
  209. * @param int|string $hour
  210. * @param int|string $minute
  211. * @return self
  212. */
  213. public function march($day = 1, $hour = 0, $minute = 0)
  214. {
  215. return $this->monthly(3, $day, $hour, $minute);
  216. }
  217. /**
  218. * Set the execution time to every April.
  219. *
  220. * @param int|string $day
  221. * @param int|string $hour
  222. * @param int|string $minute
  223. * @return self
  224. */
  225. public function april($day = 1, $hour = 0, $minute = 0)
  226. {
  227. return $this->monthly(4, $day, $hour, $minute);
  228. }
  229. /**
  230. * Set the execution time to every May.
  231. *
  232. * @param int|string $day
  233. * @param int|string $hour
  234. * @param int|string $minute
  235. * @return self
  236. */
  237. public function may($day = 1, $hour = 0, $minute = 0)
  238. {
  239. return $this->monthly(5, $day, $hour, $minute);
  240. }
  241. /**
  242. * Set the execution time to every June.
  243. *
  244. * @param int|string $day
  245. * @param int|string $hour
  246. * @param int|string $minute
  247. * @return self
  248. */
  249. public function june($day = 1, $hour = 0, $minute = 0)
  250. {
  251. return $this->monthly(6, $day, $hour, $minute);
  252. }
  253. /**
  254. * Set the execution time to every July.
  255. *
  256. * @param int|string $day
  257. * @param int|string $hour
  258. * @param int|string $minute
  259. * @return self
  260. */
  261. public function july($day = 1, $hour = 0, $minute = 0)
  262. {
  263. return $this->monthly(7, $day, $hour, $minute);
  264. }
  265. /**
  266. * Set the execution time to every August.
  267. *
  268. * @param int|string $day
  269. * @param int|string $hour
  270. * @param int|string $minute
  271. * @return self
  272. */
  273. public function august($day = 1, $hour = 0, $minute = 0)
  274. {
  275. return $this->monthly(8, $day, $hour, $minute);
  276. }
  277. /**
  278. * Set the execution time to every September.
  279. *
  280. * @param int|string $day
  281. * @param int|string $hour
  282. * @param int|string $minute
  283. * @return self
  284. */
  285. public function september($day = 1, $hour = 0, $minute = 0)
  286. {
  287. return $this->monthly(9, $day, $hour, $minute);
  288. }
  289. /**
  290. * Set the execution time to every October.
  291. *
  292. * @param int|string $day
  293. * @param int|string $hour
  294. * @param int|string $minute
  295. * @return self
  296. */
  297. public function october($day = 1, $hour = 0, $minute = 0)
  298. {
  299. return $this->monthly(10, $day, $hour, $minute);
  300. }
  301. /**
  302. * Set the execution time to every November.
  303. *
  304. * @param int|string $day
  305. * @param int|string $hour
  306. * @param int|string $minute
  307. * @return self
  308. */
  309. public function november($day = 1, $hour = 0, $minute = 0)
  310. {
  311. return $this->monthly(11, $day, $hour, $minute);
  312. }
  313. /**
  314. * Set the execution time to every December.
  315. *
  316. * @param int|string $day
  317. * @param int|string $hour
  318. * @param int|string $minute
  319. * @return self
  320. */
  321. public function december($day = 1, $hour = 0, $minute = 0)
  322. {
  323. return $this->monthly(12, $day, $hour, $minute);
  324. }
  325. /**
  326. * Validate sequence of cron expression.
  327. *
  328. * @param int|string|null $minute
  329. * @param int|string|null $hour
  330. * @param int|string|null $day
  331. * @param int|string|null $month
  332. * @param int|string|null $weekday
  333. * @return array
  334. */
  335. private function validateCronSequence($minute = null, $hour = null, $day = null, $month = null, $weekday = null)
  336. {
  337. return [
  338. 'minute' => $this->validateCronRange($minute, 0, 59),
  339. 'hour' => $this->validateCronRange($hour, 0, 23),
  340. 'day' => $this->validateCronRange($day, 1, 31),
  341. 'month' => $this->validateCronRange($month, 1, 12),
  342. 'weekday' => $this->validateCronRange($weekday, 0, 6),
  343. ];
  344. }
  345. /**
  346. * Validate sequence of cron expression.
  347. *
  348. * @param int|string|null $value
  349. * @param int $min
  350. * @param int $max
  351. * @return mixed
  352. */
  353. private function validateCronRange($value, $min, $max)
  354. {
  355. if ($value === null || $value === '*') {
  356. return '*';
  357. }
  358. if (! is_numeric($value) ||
  359. ! ($value >= $min && $value <= $max)
  360. ) {
  361. throw new InvalidArgumentException(
  362. "Invalid value: it should be '*' or between {$min} and {$max}."
  363. );
  364. }
  365. return $value;
  366. }
  367. }