CronRunBehavior.class.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2009 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. defined('THINK_PATH') or exit();
  12. /**
  13. * 自动执行任务
  14. * @category Extend
  15. * @package Extend
  16. * @subpackage Behavior
  17. * @author liu21st <liu21st@gmail.com>
  18. */
  19. class CronRunBehavior extends Behavior {
  20. protected $options = array(
  21. 'CRON_MAX_TIME' => 60, // 单个任务最大执行时间
  22. );
  23. public function run(&$params) {
  24. // 锁定自动执行
  25. $lockfile = RUNTIME_PATH.'cron.lock';
  26. if(is_writable($lockfile) && filemtime($lockfile) > $_SERVER['REQUEST_TIME'] - C('CRON_MAX_TIME')) {
  27. return ;
  28. } else {
  29. touch($lockfile);
  30. }
  31. set_time_limit(1000);
  32. ignore_user_abort(true);
  33. // 载入cron配置文件
  34. // 格式 return array(
  35. // 'cronname'=>array('filename',intervals,nextruntime),...
  36. // );
  37. if(is_file(RUNTIME_PATH.'~crons.php')) {
  38. $crons = include RUNTIME_PATH.'~crons.php';
  39. }elseif(is_file(CONF_PATH.'crons.php')){
  40. $crons = include CONF_PATH.'crons.php';
  41. }
  42. if(isset($crons) && is_array($crons)) {
  43. $update = false;
  44. $log = array();
  45. foreach ($crons as $key=>$cron){
  46. if(empty($cron[2]) || $_SERVER['REQUEST_TIME']>=$cron[2]) {
  47. // 到达时间 执行cron文件
  48. G('cronStart');
  49. include LIB_PATH.'Cron/'.$cron[0].'.php';
  50. $_useTime = G('cronStart','cronEnd', 6);
  51. // 更新cron记录
  52. $cron[2] = $_SERVER['REQUEST_TIME']+$cron[1];
  53. $crons[$key] = $cron;
  54. $log[] = "Cron:$key Runat ".date('Y-m-d H:i:s')." Use $_useTime s\n";
  55. $update = true;
  56. }
  57. }
  58. if($update) {
  59. // 记录Cron执行日志
  60. Log::write(implode('',$log));
  61. // 更新cron文件
  62. $content = "<?php\nreturn ".var_export($crons,true).";\n?>";
  63. file_put_contents(RUNTIME_PATH.'~crons.php',$content);
  64. }
  65. }
  66. // 解除锁定
  67. unlink($lockfile);
  68. return ;
  69. }
  70. }