|
|
@@ -0,0 +1,201 @@
|
|
|
+# 为pet:process-active-skills命令添加同步处理参数
|
|
|
+
|
|
|
+**时间**: 2025年06月06日 19:20
|
|
|
+**任务**: 为 `pet:process-active-skills` 命令添加一个参数,可以同步处理(不入队列)
|
|
|
+
|
|
|
+## 需求背景
|
|
|
+
|
|
|
+用户在使用 `php artisan pet:process-active-skills` 命令时,发现命令总是将任务分发到队列:
|
|
|
+
|
|
|
+```bash
|
|
|
+guomu@guomu-d5:/data/wwwroot/nusuus/kknongchang/kku_laravel$ php artisan pet:process-active-skills
|
|
|
+开始处理宠物激活技能...
|
|
|
+宠物激活技能处理任务已分发到队列
|
|
|
+```
|
|
|
+
|
|
|
+用户希望增加一个参数,可以同步处理(不入队列),这是命令设计的常见需求模式。
|
|
|
+
|
|
|
+## 实现方案
|
|
|
+
|
|
|
+### 1. 修改命令签名
|
|
|
+
|
|
|
+修改 `app/Module/Pet/Console/ProcessActiveSkillsCommand.php` 的命令签名:
|
|
|
+
|
|
|
+```php
|
|
|
+// 修改前
|
|
|
+protected $signature = 'pet:process-active-skills';
|
|
|
+
|
|
|
+// 修改后
|
|
|
+protected $signature = 'pet:process-active-skills {--sync : 同步处理,不使用队列}';
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 修改命令处理逻辑
|
|
|
+
|
|
|
+在 `handle()` 方法中添加对 `--sync` 参数的处理:
|
|
|
+
|
|
|
+```php
|
|
|
+public function handle()
|
|
|
+{
|
|
|
+ $this->info('开始处理宠物激活技能...');
|
|
|
+
|
|
|
+ try {
|
|
|
+ $sync = $this->option('sync');
|
|
|
+
|
|
|
+ if ($sync) {
|
|
|
+ // 同步处理,直接执行任务逻辑
|
|
|
+ $this->info('使用同步模式处理...');
|
|
|
+
|
|
|
+ $job = new ProcessActiveSkillsJob();
|
|
|
+ $job->handle();
|
|
|
+
|
|
|
+ $this->info('宠物激活技能处理完成(同步模式)');
|
|
|
+
|
|
|
+ Log::info('宠物激活技能定时命令执行成功(同步模式)');
|
|
|
+ } else {
|
|
|
+ // 分发任务到队列
|
|
|
+ ProcessActiveSkillsJob::dispatch();
|
|
|
+
|
|
|
+ $this->info('宠物激活技能处理任务已分发到队列');
|
|
|
+
|
|
|
+ Log::info('宠物激活技能定时命令执行成功(队列模式)');
|
|
|
+ }
|
|
|
+
|
|
|
+ return Command::SUCCESS;
|
|
|
+
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ $this->error('处理宠物激活技能失败: ' . $e->getMessage());
|
|
|
+
|
|
|
+ Log::error('宠物激活技能定时命令执行失败', [
|
|
|
+ 'error' => $e->getMessage(),
|
|
|
+ 'trace' => $e->getTraceAsString(),
|
|
|
+ 'sync_mode' => $this->option('sync')
|
|
|
+ ]);
|
|
|
+
|
|
|
+ return Command::FAILURE;
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 遇到的问题和修复
|
|
|
+
|
|
|
+### 问题:PetActiveSkill模型config字段类型转换错误
|
|
|
+
|
|
|
+在测试同步模式时,遇到了以下错误:
|
|
|
+
|
|
|
+```
|
|
|
+TypeError: Cannot access offset of type string on string
|
|
|
+at app/Module/Pet/Models/PetActiveSkill.php:152
|
|
|
+```
|
|
|
+
|
|
|
+**根因分析**:
|
|
|
+- `PetActiveSkill` 模型的 `config` 字段被设置为 `array` 类型转换
|
|
|
+- 但在某些情况下,Laravel的类型转换没有正确工作,导致 `config` 仍然是字符串类型
|
|
|
+- 当代码尝试访问 `$this->config['last_check_time']` 时,就会出现类型错误
|
|
|
+
|
|
|
+**修复方案**:
|
|
|
+为所有访问 `config` 字段的方法添加类型检查和转换:
|
|
|
+
|
|
|
+```php
|
|
|
+public function updateLastCheckTime(): bool
|
|
|
+{
|
|
|
+ $config = $this->config;
|
|
|
+
|
|
|
+ // 确保config是数组类型
|
|
|
+ if (!is_array($config)) {
|
|
|
+ // 如果是字符串,尝试解析JSON
|
|
|
+ if (is_string($config)) {
|
|
|
+ $config = json_decode($config, true);
|
|
|
+ if (json_last_error() !== JSON_ERROR_NONE) {
|
|
|
+ $config = [];
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ $config = [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ $config['last_check_time'] = now()->toDateTimeString();
|
|
|
+ $this->config = $config;
|
|
|
+ return $this->save();
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+修复了以下方法:
|
|
|
+- `updateLastCheckTime()`
|
|
|
+- `getLastCheckTime()`
|
|
|
+- `shouldCheck()`
|
|
|
+- `getConfigValue()`
|
|
|
+- `setConfigValue()`
|
|
|
+
|
|
|
+## 使用方法
|
|
|
+
|
|
|
+### 1. 队列模式(默认)
|
|
|
+
|
|
|
+```bash
|
|
|
+php artisan pet:process-active-skills
|
|
|
+```
|
|
|
+
|
|
|
+输出:
|
|
|
+```
|
|
|
+开始处理宠物激活技能...
|
|
|
+宠物激活技能处理任务已分发到队列
|
|
|
+```
|
|
|
+
|
|
|
+### 2. 同步模式(新增)
|
|
|
+
|
|
|
+```bash
|
|
|
+php artisan pet:process-active-skills --sync
|
|
|
+```
|
|
|
+
|
|
|
+输出:
|
|
|
+```
|
|
|
+开始处理宠物激活技能...
|
|
|
+使用同步模式处理...
|
|
|
+宠物激活技能处理完成(同步模式)
|
|
|
+```
|
|
|
+
|
|
|
+### 3. 查看帮助
|
|
|
+
|
|
|
+```bash
|
|
|
+php artisan pet:process-active-skills --help
|
|
|
+```
|
|
|
+
|
|
|
+输出:
|
|
|
+```
|
|
|
+Description:
|
|
|
+ 处理宠物激活技能的定时任务
|
|
|
+
|
|
|
+Usage:
|
|
|
+ pet:process-active-skills [options]
|
|
|
+
|
|
|
+Options:
|
|
|
+ --sync 同步处理,不使用队列
|
|
|
+ -h, --help Display help for the given command
|
|
|
+ ...
|
|
|
+```
|
|
|
+
|
|
|
+## 技术特点
|
|
|
+
|
|
|
+1. **向后兼容**:默认行为保持不变,仍然使用队列模式
|
|
|
+2. **灵活选择**:用户可以根据需要选择队列模式或同步模式
|
|
|
+3. **错误处理**:完善的异常处理和日志记录
|
|
|
+4. **类型安全**:修复了config字段的类型转换问题
|
|
|
+
|
|
|
+## 适用场景
|
|
|
+
|
|
|
+- **队列模式**:适用于定时任务、后台处理,不阻塞当前进程
|
|
|
+- **同步模式**:适用于调试、测试、立即执行需求
|
|
|
+
|
|
|
+## 文件修改清单
|
|
|
+
|
|
|
+1. `app/Module/Pet/Console/ProcessActiveSkillsCommand.php` - 添加--sync参数支持
|
|
|
+2. `app/Module/Pet/Models/PetActiveSkill.php` - 修复config字段类型转换问题
|
|
|
+
|
|
|
+## 提交信息
|
|
|
+
|
|
|
+```
|
|
|
+为pet:process-active-skills命令添加同步处理参数:支持--sync选项绕过队列直接处理,并修复PetActiveSkill模型config字段类型转换问题
|
|
|
+```
|
|
|
+
|
|
|
+## 完成时间
|
|
|
+
|
|
|
+2025-06-06 19:20
|