Explorar el Código

update: 异步任务代码整理

joe hace 4 años
padre
commit
93063590c8

+ 38 - 0
crmeb/services/async/task/AsyncSms.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace crmeb\services\async\task;
+
+use crmeb\repositories\ShortLetterRepositories;
+
+/**
+ * 异步发短信
+ */
+class AsyncSms extends Task {
+
+    const CMD = 'sms';
+
+    protected static function getCmd()
+    {
+        return self::CMD;
+    }
+
+    public static function exec(array $task)
+    {
+        if (!self::checkTask($task)) {
+            return false;
+        }
+
+        $params = $task['params'];
+
+        return ShortLetterRepositories::send(true, $params['phone'], $params['data'], $params['template']);
+    }
+
+    public static function push(string $phone, array $data, string $template)
+    {
+        return self::put([
+            'phone' => $phone,
+            'data'  => $data,
+            'template' => $template,
+        ]);
+    }
+}

+ 79 - 0
crmeb/services/async/task/Task.php

@@ -0,0 +1,79 @@
+<?php
+
+namespace crmeb\services\async\task;
+
+use crmeb\utils\Beanstalk;
+use think\facade\Config;
+use think\facade\Log;
+
+
+abstract class Task {
+    /**
+     * 得到任务 cmd 标识, 任务类别
+     * 
+     * @return string
+     */
+    abstract protected static function getCmd();
+
+    /**
+     * 执行从 beanstalkd 中取出的任务数据 $task.
+     * 
+     * @return boolean
+     */
+    abstract public static function exec(array $task);
+
+    /**
+     * 任务自由的数据都叫 params
+     * 这个函数打包成任务数据
+     * @return array
+     */
+    protected static function formatJob(array $params)
+    {
+        return [
+            'cmd' => static::getCmd(),
+            'ts'  => time(),
+            'sender' => '0',
+            'params' => $params,
+        ];
+    }
+
+    /**
+     * 插入任务到 beanstalk
+     * 
+     * @params 具体某个任务需要的参数
+     * @return boolean
+     */
+    protected static function put(array $params)
+    {
+        $bean = Beanstalk::instance();
+        $tube = Config::get('app.beanstalk_tube', 'twong');
+        $arr = self::formatJob($params);
+        $json = json_encode($arr);
+        try {
+            $bean::useTube($tube)->put($json);
+        } catch (\Exception $e) {
+            Log::error('beanstalk put failed: ' . $json . ' error:' . $e->getMessage());
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * job 格式基本检查
+     * 
+     * @return boolean
+     */
+    protected static function checkTask($task)
+    {
+        if (!$task || !isset($task['cmd']) || $task['cmd'] != self::getCmd()) {
+            Log::error('task format error: null or invalid cmd');
+            return false;
+        }
+
+        if (!isset($task['params']) || !is_array($task['params'])) {
+            Log::error('task format error: without params or not an array.');
+            return false;
+        }
+        return true;
+    }
+}

+ 12 - 25
crmeb/services/async/task/WechatNotify.php

@@ -2,18 +2,14 @@
 
 namespace crmeb\services\async\task;
 
-use crmeb\utils\Beanstalk;
 use crmeb\services\QyWeixinService;
-use think\facade\Config;
 use think\facade\Log;
 
 /**
  * 异步机器人通知.
- * 消息格式:
- * {"type":"type_name", "key":"1234", "desc":''}
  * Class WechatNotify
  */
-class WechatNotify
+class WechatNotify extends Task
 {
     const CMD = 'wechat';
 
@@ -28,25 +24,16 @@ class WechatNotify
 
     public static function push(string $type, string $key, string $desc = '')
     {
-        $bean = Beanstalk::instance();
-        $tube = Config::get('app.beanstalk_tube', 'twong');
-        $arr = [
-            'cmd' => self::CMD,
-            'ts'  => time(),
-            'sender' => '0',
-            'params' => [
-                'type' => $type,
-                'key'  => $key,
-                'desc' => $desc,
-            ],
-        ];
+        self::put([
+            'type' => $type,
+            'key'  => $key,
+            'desc' => $desc,
+        ]);
+    }
 
-        $json = json_encode($arr);
-        try {
-            $bean::useTube($tube)->put($json);
-        } catch (\Exception $e) {
-            Log::error('push failed: ' . $json);
-        }
+    protected static function getCmd()
+    {
+        return self::CMD;
     }
 
     /**
@@ -56,10 +43,10 @@ class WechatNotify
      */
     public static function exec(array $task)
     {
-        if (!$task || !isset($task['cmd']) || $task['cmd'] != self::CMD) {
-            Log::error('invalid cmd');
+        if (!self::checkTask($task)) {
             return false;
         }
+        
         // must has value
         $params = $task['params'];