Browse Source

改进 Cron 表达式的正则

luolongfei 4 years ago
parent
commit
e6a115e084
3 changed files with 51 additions and 4 deletions
  1. 46 0
      app/Console/Cron.php
  2. 1 1
      app/Console/FreeNom.php
  3. 4 3
      docker-entrypoint.sh

+ 46 - 0
app/Console/Cron.php

@@ -0,0 +1,46 @@
+<?php
+/**
+ * @author mybsdc <[email protected]>
+ * @date 2021/11/17
+ * @time 11:23
+ */
+
+namespace Luolongfei\App\Console;
+
+class Cron extends Base
+{
+    /**
+     * @var Cron
+     */
+    private static $instance;
+
+    /**
+     * @return Cron
+     */
+    public static function getInstance()
+    {
+        if (!self::$instance instanceof self) {
+            self::$instance = new self();
+        }
+
+        return self::$instance;
+    }
+
+    private function __construct()
+    {
+    }
+
+    private function __clone()
+    {
+    }
+
+    /**
+     * 验证 Cron 表达式是否合法
+     */
+    public function verify()
+    {
+        $cronExp = get_argv('cron_exp');
+
+        echo preg_match('/^(?:\*(?:\/\d+)?|[0-5]?\d(?:,[0-5]?\d)*|[0-5]?\d-[0-5]?\d(?:\/\d+)?) (?:\*(?:\/\d+)?|(?:\d|0\d|1\d|2[0-3])(?:,(?:\d|0\d|1\d|2[0-3]))*|(?:\d|0\d|1\d|2[0-3])-(?:\d|0\d|1\d|2[0-3])(?:\/\d+)?) (?:\*(?:\/\d+)?|(?:0?[1-9]|1\d|2\d|3[0-1])(?:,(?:0?[1-9]|1\d|2\d|3[0-1]))*|(?:0?[1-9]|1\d|2\d|3[0-1])-(?:0?[1-9]|1\d|2\d|3[0-1])(?:\/\d+)?) (?:\*(?:\/\d+)?|(?:0?[1-9]|1[0-2])(?:,(?:0?[1-9]|1[0-2]))*|(?:0?[1-9]|1[0-2])-(?:0?[1-9]|1[0-2])(?:\/\d+)?|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC) (?:\*(?:\/\d+)?|0?[0-6](?:,0?[0-6])*|0?[0-6]-0?[0-6](?:\/\d+)?|SUN|MON|TUE|WED|THU|FRI|SAT)$/i', $cronExp);
+    }
+}

+ 1 - 1
app/Console/FreeNom.php

@@ -18,7 +18,7 @@ use Luolongfei\Libs\Message;
 
 class FreeNom extends Base
 {
-    const VERSION = 'v0.4.3';
+    const VERSION = 'v0.4.4';
 
     const TIMEOUT = 33;
 

+ 4 - 3
docker-entrypoint.sh

@@ -38,11 +38,12 @@ else
         hour=$( echo ${RUN_AT} | egrep -o '^([01][0-9]|2[0-3]|[0-9])' )
         CRON_COMMAND="${minute} ${hour} * * * ${PHP_COMMAND}"
         echo -e "[${green}Info${plain}] 你已指定执行时间,续期任务将在北京时间每天 「${hour}:${minute}」 执行"
-    elif [[ "${RUN_AT}" =~ ^([0-9\/*-]+( |$)){5}$ ]]; then
+    elif [ "$(php /app/run -c=Cron -m=verify --cron_exp="${RUN_AT}")" -eq 1 ]; then
         CRON_COMMAND="${RUN_AT} ${PHP_COMMAND}"
+        echo -e "[${green}Info${plain}] 你自定义的 Cron 表达式为「${RUN_AT}」,已通过正则验证"
     else
         echo -e "[${red}Error${plain}] RUN_AT 的值无效"
-        echo -e "${yellow}请输入一个有效的时间指令,其值可以为时分格式,如:11:24,也可以为 CRON 命令中的时间格式,如:'24 11 * * *',甚至可以不输入,让程序自动生成,推荐采用自动生成的方式,不建议手动指定此环境变量"
+        echo -e "${yellow}请输入一个有效的时间指令,其值可以为时分格式,如:11:24,也可以为 Cron 表达式,如:'24 11 * * *',甚至可以不输入,让程序自动生成,推荐采用自动生成的方式,不建议手动指定此环境变量"
         exit 1
     fi
 fi
@@ -51,7 +52,7 @@ fi
 sed -i '/freenom_cron/'d /etc/crontabs/root
 echo -e "${CRON_COMMAND}" >> /etc/crontabs/root
 
-echo -e "[${green}Info${plain}] CRON_COMMAND: ${CRON_COMMAND}"
+echo -e "[${green}Info${plain}] 计划任务:${CRON_COMMAND}"
 
 php run