cron.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. $fStart = microtime(true);
  93. $oDb = BxDolCronQuery::getInstance();
  94. $oDb->updateJob($aJob['id'], array('ts' => time(), 'timing' => 0));
  95. if (!empty($aJob['file']) && !empty($aJob['class']) && file_exists(BX_DIRECTORY_PATH_ROOT . $aJob['file'])) {
  96. if (!class_exists($aJob['class'], false))
  97. require_once(BX_DIRECTORY_PATH_ROOT . $aJob['file']);
  98. $oHandler = new $aJob['class']();
  99. $oHandler->processing();
  100. } else if (!empty($aJob['service_call']) && BxDolService::isSerializedService($aJob['service_call'])) {
  101. BxDolService::callSerialized($aJob['service_call']);
  102. }
  103. bx_log('sys_cron_jobs', $aJob['name'] . ' / timing: ' . (microtime(true) - $fStart) . ' / memory: ' . memory_get_usage());
  104. $oDb->updateJob($aJob['id'], array('timing' => microtime(true) - $fStart));
  105. }
  106. bx_import('BxDolCronQuery');
  107. $oDb = BxDolCronQuery::getInstance();
  108. setParam('sys_cron_time', time());
  109. // run one time transient jobs
  110. $aJobsTransient = $oDb->getTransientJobs();
  111. if (!empty($aJobsTransient)) {
  112. if (!defined('BX_CRON_FILTER') || in_array($aJobsTransient['name'], constant('BX_CRON_FILTER'))) {
  113. $oDb->deleteTransientJobs();
  114. foreach ($aJobsTransient as $aRow)
  115. runJob($aRow);
  116. if (isset($aJobsTransient['sys_perform_upgrade']))
  117. exit;
  118. }
  119. }
  120. if (bx_check_maintenance_mode()) // don't run regular cron jobs when site is in maintenance mode
  121. exit;
  122. bx_import('BxDolLanguages');
  123. // run regular cron jobs
  124. $aJobs = $oDb->getJobs();
  125. $aDate = getdate(time());
  126. foreach($aJobs as $aRow) {
  127. if (!defined('BX_CRON_FILTER') || in_array($aRow['name'], constant('BX_CRON_FILTER')))
  128. if (checkCronJob($aRow['time'], $aDate))
  129. runJob($aRow);
  130. }
  131. // run automators (schedulers)
  132. bx_import('BxDolAI');
  133. $oAi = BxDolAI::getInstance();
  134. $aAutomators = $oAi->getAutomatorsScheduler();
  135. foreach($aAutomators as $aAutomator) {
  136. if(checkCronJob($aAutomator['params']['scheduler_time'], $aDate))
  137. $oAi->callAutomator(BX_DOL_AI_AUTOMATOR_SCHEDULER, [
  138. 'automator' => $aAutomator
  139. ]);
  140. }
  141. /** @} */