创世神域

Nothing is impossible.

@Puteulanus4年前

05/18
11:26
学习心得

Cron修正程序

闲着无聊练练手。。

因为1分钟一次的免费Cron实在太难找,云监控频率又普遍比较低,所以写了这货。它会在前四次执行的时候记录下执行时间,计算出Cron的执行间隔,然后从第五次开始在Cron执行的间隔中依靠自身的循环对Cron进行补充。

简单来说,它会把任意频率的Cron修正到1分钟一次。

测试中使用监控宝15分钟一次和30分钟一次的监控都运行良好,执行时间记录显示执行频率接近标准的1分钟一次。

使用方法是把它改名xcron.php【其它也行啦,别和cron文件重名就好了】,和需要执行的cron.php放在一个目录下,然后把云监控的目标设置为xcron.php。

代码:

  1. <?php
  2. // 设定参数
  3. $phpfile = ‘cron.php’;// 需要执行的Cron文件名
  4. $time = 1;// 间隔分钟数
  5. // 关闭浏览器仍然执行
  6. set_time_limit(0);
  7. ignore_user_abort(true);
  8. // 读取记录
  9. $A=$B=$C=$D= 0;
  10. $F = off;
  11. include(‘cronlog.php’);
  12. if (time() – $A < 30)
  13.     exit;
  14. // 判断是否有进程在执行
  15. if ($F == on)
  16.     exit();
  17. // 判断D是否为空
  18. if ($D == 0){
  19.     $D = $C;
  20.     $C = $B;
  21.     $B = $A;
  22.     $A = time();
  23.     writelog($A,$B,$C,$D,$F);
  24.     include($phpfile);
  25.     exit();
  26. }
  27. //  启动修正
  28. $D = $C;
  29. $C = $B;
  30. $B = $A;
  31. $A = time();
  32. $E = ($A$D)/3;
  33. writelog($A,$B,$C,$D,$F);
  34. // 计算运行次数
  35. $time *= 60;
  36. $i=round($E/$time);
  37. if ($i <= 0){
  38.     include($phpfile);
  39.     exit();
  40. }
  41. if ($i > 60){
  42.     $A=$B=$C=$D= 0;
  43.     $F = off;
  44.     writelog($A,$B,$C,$D,$F);
  45.     exit();
  46. }
  47. // 防止多进程运行
  48. $F = on;
  49. writelog($A,$B,$C,$D,$F);
  50. // 循环
  51. $u=1;
  52. while($u<=$i){
  53.     include($phpfile);
  54.     if ($A+$E-time()<120){
  55.         $F = off;
  56.         writelog($A,$B,$C,$D,$F);
  57.     }
  58.     if ($A+$E-time()<60)
  59.         exit();
  60.     sleep ($time);
  61.     $u++;
  62. }
  63. exit();
  64. // 自定义函数
  65. function writelog($A,$B,$C,$D,$F){
  66.     $file = ‘<?php’.PHP_EOL.’$A = ‘.$A.’;’.PHP_EOL.’$B = ‘.$B.’;’.PHP_EOL.’$C = ‘.$C.’;’.PHP_EOL.’$D = ‘.$D.’;’.PHP_EOL.’$F = ‘.$F.’;’.PHP_EOL.’?>’;
  67.     file_put_contents(“cronlog.php”,$file);
  68. }
  69. ?>

Cron修正程序