cron.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. /**
  3. * Copyright (c) UNA, Inc - https://una.io
  4. * MIT License - https://opensource.org/licenses/MIT
  5. *
  6. * @defgroup UnaCore UNA Core
  7. * @{
  8. */
  9. $GLOBALS['bx_profiler_disable'] = true;
  10. define('BX_DOL_CRON_EXECUTE', '1');
  11. $aPathInfo = pathinfo(__FILE__);
  12. require_once ($aPathInfo['dirname'] . '/../inc/header.inc.php');
  13. function getRange($iLow, $iHigh, $iStep)
  14. {
  15. $aResult = array();
  16. for ($i = $iLow; $i <= $iHigh && $iStep; $i += $iStep)
  17. $aResult[] = $i;
  18. return $aResult;
  19. }
  20. function getPeriod($sPeriod, $iLow, $iHigh)
  21. {
  22. $aRes = array();
  23. $iStep = 1;
  24. $sErr = '';
  25. do {
  26. if ('' === $sPeriod) {
  27. $sErr = 'Variable sPeriod is emply';
  28. break;
  29. }
  30. $aParam = explode('/', $sPeriod);
  31. if (count($aParam) > 2) {
  32. $sErr = 'Error of format for string assigning period';
  33. break;
  34. }
  35. if (count($aParam) == 2 && is_numeric($aParam[1]))
  36. $iStep = $aParam[1];
  37. $sPeriod = $aParam[0];
  38. if ($sPeriod != '*') {
  39. $aParam = explode('-', $sPeriod);
  40. if (count($aParam) > 2) {
  41. $sErr = 'Error of format for string assigning period';
  42. break;
  43. }
  44. if (count($aParam) == 2)
  45. $aRes = getRange($aParam[0], $aParam[1], $iStep);
  46. else
  47. $aRes = explode(',', $sPeriod);
  48. } else
  49. $aRes = getRange($iLow, $iHigh, $iStep);
  50. } while(false);
  51. if ($sErr) {
  52. // show error or add to log
  53. }
  54. return $aRes;
  55. }
  56. function checkCronJob($sPeriods, $aDate = array())
  57. {
  58. $aParam = explode(' ', preg_replace("{ +}", ' ', trim($sPeriods)));
  59. $bRes = true;
  60. if(empty($aDate))
  61. $aDate = getdate(time());
  62. for ($i = 0; $i < count($aParam); $i++) {
  63. switch ($i) {
  64. case 0:
  65. $aRes = getPeriod($aParam[$i], 0, 59);
  66. $bRes = in_array($aDate['minutes'], $aRes);
  67. break;
  68. case 1:
  69. $aRes = getPeriod($aParam[$i], 0, 23);
  70. $bRes = in_array($aDate['hours'], $aRes);
  71. break;
  72. case 2:
  73. $aRes = getPeriod($aParam[$i], 1, 31);
  74. $bRes = in_array($aDate['mday'], $aRes);
  75. break;
  76. case 3:
  77. $aRes = getPeriod($aParam[$i], 1, 12);
  78. $bRes = in_array($aDate['mon'], $aRes);
  79. break;
  80. case 4:
  81. $aRes = getPeriod($aParam[$i], 0, 6);
  82. $bRes = in_array($aDate['wday'], $aRes);
  83. break;
  84. }
  85. if (!$bRes)
  86. break;
  87. }
  88. return $bRes;
  89. }
  90. function runJob($aJob)
  91. {
  92. if (!empty($aJob['file']) && !empty($aJob['class']) && file_exists(BX_DIRECTORY_PATH_ROOT . $aJob['file'])) {
  93. if (!class_exists($aJob['class'], false))
  94. require_once(BX_DIRECTORY_PATH_ROOT . $aJob['file']);
  95. $oHandler = new $aJob['class']();
  96. $oHandler->processing();
  97. } else if (!empty($aJob['service_call']) && BxDolService::isSerializedService($aJob['service_call']))
  98. BxDolService::callSerialized($aJob['service_call']);
  99. }
  100. bx_import('BxDolCronQuery');
  101. $oDb = BxDolCronQuery::getInstance();
  102. setParam('sys_cron_time', time());
  103. // run one time transient jobs
  104. $aJobsTransient = $oDb->getTransientJobs();
  105. if (!empty($aJobsTransient)) {
  106. $oDb->deleteTransientJobs();
  107. foreach ($aJobsTransient as $aRow)
  108. runJob($aRow);
  109. if (isset($aJobsTransient['sys_perform_upgrade']))
  110. exit;
  111. }
  112. if (bx_check_maintenance_mode()) // don't run regular cron jobs when site is in maintenance mode
  113. exit;
  114. bx_import('BxDolLanguages');
  115. // run regular cron jobs
  116. $aJobs = $oDb->getJobs();
  117. $aDate = getdate(time());
  118. foreach($aJobs as $aRow) {
  119. if (checkCronJob($aRow['time'], $aDate))
  120. runJob($aRow);
  121. }
  122. /** @} */