Explorar o código

解决ob_flush刷新缓存的问题

lh hai 23 horas
pai
achega
78345a6be3
Modificáronse 2 ficheiros con 81 adicións e 185 borrados
  1. 66 180
      app/Http/Controllers/Anime/AnimeController.php
  2. 15 5
      app/Services/Anime/AnimeService.php

+ 66 - 180
app/Http/Controllers/Anime/AnimeController.php

@@ -476,7 +476,9 @@ class AnimeController extends BaseController
                 'type' => 'init',
                 'data' => $result
             ]) . "\n\n";
-            ob_flush();
+            if (ob_get_level() > 0) {
+                ob_flush();
+            }
             flush();
             
             $startTime = time();
@@ -492,7 +494,9 @@ class AnimeController extends BaseController
                             'type' => 'error',
                             'message' => '任务不存在'
                         ]) . "\n\n";
-                        ob_flush();
+                        if (ob_get_level() > 0) {
+                            ob_flush();
+                        }
                         flush();
                         break;
                     }
@@ -634,7 +638,9 @@ class AnimeController extends BaseController
                             'elapsed_time' => time() - $startTime
                         ]
                     ]) . "\n\n";
-                    ob_flush();
+                    if (ob_get_level() > 0) {
+                        ob_flush();
+                    }
                     flush();
                     
                     // 如果任务完成(成功或失败),结束连接
@@ -653,7 +659,9 @@ class AnimeController extends BaseController
                                 'error_message' => $task->error_message ? mapErrorMessage($task->error_message) : ''
                             ]
                         ]) . "\n\n";
-                        ob_flush();
+                        if (ob_get_level() > 0) {
+                            ob_flush();
+                        }
                         flush();
                         break;
                     }
@@ -665,7 +673,9 @@ class AnimeController extends BaseController
                         'type' => 'error',
                         'message' => '查询任务状态失败: ' . $e->getMessage()
                     ]) . "\n\n";
-                    ob_flush();
+                    if (ob_get_level() > 0) {
+                        ob_flush();
+                    }
                     flush();
                     sleep($checkInterval);
                 }
@@ -680,7 +690,9 @@ class AnimeController extends BaseController
                         'task_id' => $taskId
                     ]
                 ]) . "\n\n";
-                ob_flush();
+                if (ob_get_level() > 0) {
+                    ob_flush();
+                }
                 flush();
             }
             
@@ -1036,7 +1048,9 @@ class AnimeController extends BaseController
                 'completed_tasks_count' => count($completeTasks),
                 'success_tasks_count' => count($successTasks)
             ]) . "\n\n";
-            ob_flush();
+            if (ob_get_level() > 0) {
+                ob_flush();
+            }
             flush();
             
             while (time() - $startTime < $maxDuration) {
@@ -1204,7 +1218,9 @@ class AnimeController extends BaseController
                             'completed_tasks_count' => count($completeTasks),
                             'success_tasks_count' => count($successTasks)
                         ]) . "\n\n";
-                        ob_flush();
+                        if (ob_get_level() > 0) {
+                            ob_flush();
+                        }
                         flush();
                     }
                     
@@ -1239,7 +1255,9 @@ class AnimeController extends BaseController
                             'success_tasks_count' => count($successTasks),
                             'success_segments' => $successSegments
                         ]) . "\n\n";
-                        ob_flush();
+                        if (ob_get_level() > 0) {
+                            ob_flush();
+                        }
                         flush();
                         break;
                     }
@@ -1259,7 +1277,9 @@ class AnimeController extends BaseController
                         'completed_tasks_count' => count($completeTasks),
                         'success_tasks_count' => count($successTasks)
                     ]) . "\n\n";
-                    ob_flush();
+                    if (ob_get_level() > 0) {
+                        ob_flush();
+                    }
                     flush();
                     
                     // 检查是否超时,如果超时则停止循环
@@ -1280,7 +1300,9 @@ class AnimeController extends BaseController
                     'completed_tasks_count' => count($completeTasks),
                     'success_tasks_count' => count($successTasks)
                 ]) . "\n\n";
-                ob_flush();
+                if (ob_get_level() > 0) {
+                    ob_flush();
+                }
                 flush();
             }
             
@@ -1945,7 +1967,9 @@ class AnimeController extends BaseController
                         'episode_info' => $episode ?? null
                     ]
                 ]) . "\n\n";
-                ob_flush();
+                if (ob_get_level() > 0) {
+                    ob_flush();
+                }
                 flush();
                 return;
             }
@@ -1961,7 +1985,9 @@ class AnimeController extends BaseController
                     'max_duration' => $maxDuration
                 ]
             ]) . "\n\n";
-            ob_flush();
+            if (ob_get_level() > 0) {
+                ob_flush();
+            }
             flush();
             
             $completedSegments = [];
@@ -2098,7 +2124,9 @@ class AnimeController extends BaseController
                                 'remaining_time' => max(0, $maxDuration - (time() - $startTime))
                             ]
                         ]) . "\n\n";
-                        ob_flush();
+                        if (ob_get_level() > 0) {
+                            ob_flush();
+                        }
                         flush();
                     }
                     
@@ -2148,7 +2176,7 @@ class AnimeController extends BaseController
                                 'episode_info' => $episode ?? null
                             ]
                         ]) . "\n\n";
-                        ob_flush();
+                        if (ob_get_level() > 0) ob_flush();
                         flush();
                         break;
                     }
@@ -2167,7 +2195,7 @@ class AnimeController extends BaseController
                         'elapsed_time' => time() - $startTime,
                         'remaining_time' => max(0, $maxDuration - (time() - $startTime))
                     ]) . "\n\n";
-                    ob_flush();
+                    if (ob_get_level() > 0) ob_flush();
                     flush();
                     
                     if (time() - $startTime >= $maxDuration) {
@@ -2193,7 +2221,7 @@ class AnimeController extends BaseController
                         'timeout_duration' => $maxDuration
                     ]
                 ]) . "\n\n";
-                ob_flush();
+                if (ob_get_level() > 0) ob_flush();
                 flush();
             }
             
@@ -2445,10 +2473,7 @@ class AnimeController extends BaseController
                 'type' => 'init',
                 'data' => $result
             ]) . "\n\n";
-            if (ob_get_level() > 0) {
-                ob_end_flush();
-            }
-            ob_flush();
+            if (ob_get_level() > 0) ob_flush();
             flush();
             
             $startTime = time();
@@ -2466,154 +2491,11 @@ class AnimeController extends BaseController
                             'type' => 'error',
                             'message' => '任务不存在'
                         ]) . "\n\n";
-                        ob_flush();
+                        if (ob_get_level() > 0) ob_flush();
                         flush();
                         break;
                     }
                     
-                    // // 如果任务还在处理中,查询最新状态
-                    // if ($task->status === 'processing') {
-                    //     // 根据任务类型查询不同的状态
-                    //     if ($task->api_type === 'jimeng') {
-                    //         $statusResult = $this->AIVideoGenerationService->queryJimengTaskStatus($task);
-                    //     } elseif ($task->api_type === 'keling') {
-                    //         $statusResult = $this->AIVideoGenerationService->queryKelingOmniTaskStatus($task);
-                    //     } elseif ($task->api_type === 'zzengine') {
-                    //         $statusResult = $this->AIVideoGenerationService->queryUnifiedApiTaskStatus($task);
-                    //     } else {
-                    //         $statusResult = $this->AIVideoGenerationService->querySeedanceTaskStatus($task);
-                    //     }
-                    //     if (isset($statusResult['status'])) {
-                    //         // 更新任务状态
-                    //         $task->update([
-                    //             'status' => $statusResult['status'],
-                    //             'result_url' => $statusResult['result_url'] ?? null,
-                    //             'compressed_url' => $statusResult['compressed_url'] ?? null,
-                    //             'last_frame_url' => $statusResult['last_frame_url'] ?? '',
-                    //             'error_message' => $statusResult['error_message'] ?? null,
-                    //             'completed_at' => in_array($statusResult['status'], [
-                    //                 'success',
-                    //                 'failed'
-                    //             ]) ? now() : null
-                    //         ]);
-                            
-                    //         // 如果任务成功,更新分镜表
-                    //         if ($statusResult['status'] === 'success' && isset($statusResult['result_url'])) {
-                    //             try {
-                    //                 DB::beginTransaction();
-                                    
-                    //                 $now = date('Y-m-d H:i:s');
-                                    
-                    //                 // 获取分镜ID
-                    //                 $act = DB::table('mp_episode_segments')
-                    //                     ->where('video_task_id', $taskId)
-                    //                     ->first();
-                                    
-                    //                 if (!$act) {
-                    //                     throw new \Exception('未找到对应的片段记录');
-                    //                 }
-                                    
-                    //                 $act_id = $act->id;
-                    //                 $anime_id = $act->anime_id;
-                    //                 $episode_number = $act->episode_number;
-                    //                 $act_content = $act->act_content;
-                                    
-                    //                 // 更新分镜表
-                    //                 $segmentUpdateData = [
-                    //                     'origin_video_url' => $statusResult['result_url'],
-                    //                     'video_task_status' => '已完成',
-                    //                     'last_frame_url' => $statusResult['last_frame_url'] ?? '',
-                    //                     'current_type' => 2,
-                    //                     'updated_at' => $now
-                    //                 ];
-                    //                 $compressed_video_url = compressVideo($statusResult['result_url']);
-                    //                 $segmentUpdateData['video_url'] = $compressed_video_url ?: $statusResult['result_url'];
-                                    
-                    //                 // 只有当video_duration存在且大于0时才更新
-                    //                 if (isset($statusResult['video_duration']) && $statusResult['video_duration'] > 0) {
-                    //                     $segmentUpdateData['video_duration'] = $statusResult['video_duration'];
-                    //                     $segmentUpdateData['video_time_point_start'] = 0;
-                    //                     $segmentUpdateData['video_time_point_end'] = $statusResult['video_duration'];
-                    //                 }
-                                    
-                    //                 $updateResult = DB::table('mp_episode_segments')
-                    //                     ->where('id', $act_id)
-                    //                     ->update($segmentUpdateData);
-                                    
-                    //                 if (!$updateResult) {
-                    //                     Utils::throwError('20003:更新分镜表失败');
-                    //                 }
-
-                    //                 // 更新分镜视频成功后新增对话记录
-                    //                 // 获取参考图记录
-                    //                 $reference_images = getProp($task, 'ref_image_url');
-                    //                 if (!$reference_images) $reference_images = json_encode([], 256);
-                    //                 // 保存对话记录
-                    //                 $records = [
-                    //                     [
-                    //                         'uid'           => $uid,
-                    //                         'anime_id'      => $anime_id,
-                    //                         'sequence'      => $episode_number,
-                    //                         'role'          => 'user',
-                    //                         'content'       => '片段转视频',
-                    //                         'act_id'        => $act_id,
-                    //                         'video_url'     => '',
-                    //                         'created_at'    => $now,
-                    //                         'updated_at'    => $now
-                    //                     ],
-                    //                     [
-                    //                         'uid'           => $uid,
-                    //                         'anime_id'      => $anime_id,
-                    //                         'sequence'      => $episode_number,
-                    //                         'role'          => 'assistant',
-                    //                         'content'       => $act_content,
-                    //                         'act_id'        => $act_id,
-                    //                         'video_url'     => $statusResult['result_url'],
-                    //                         'reference_images' => $reference_images,
-                    //                         'created_at'    => $now,
-                    //                         'updated_at'    => $now
-                    //                     ]
-                    //                 ];
-
-                    //                 DB::table('mp_anime_records')->insert($records);
-                                    
-                    //                 DB::commit();
-                                    
-                    //             } catch (\Exception $e) {
-                    //                 DB::rollBack();
-                                    
-                    //                 $logData = [
-                    //                     'task_id' => $taskId,
-                    //                     'error' => $e->getMessage()
-                    //                 ];
-                    //                 dLog('anime')->error('视频任务处理失败', $logData);
-                    //                 logDB('anime', 'error', '视频任务处理失败', $logData);
-                    //             }
-                    //         } elseif ($statusResult['status'] === 'failed') {
-                    //             DB::table('mp_episode_segments')
-                    //                 ->where('video_task_id', $taskId)
-                    //                 ->update([
-                    //                     'video_task_status' => '失败',
-                    //                     'updated_at' => date('Y-m-d H:i:s')
-                    //                 ]);
-                    //         }
-                    //     }
-                    // }
-                    // 
-                    // // 发送当前状态
-                    // echo "data: " . json_encode([
-                    //     'type' => 'update',
-                    //     'data' => [
-                    //         'task_id' => $task->id,
-                    //         'status' => $task->status,
-                    //         'result_url' => $task->result_url,
-                    //         'error_message' => $task->error_message,
-                    //         'elapsed_time' => time() - $startTime
-                    //     ]
-                    // ]) . "\n\n";
-                    // ob_flush();
-                    // flush();
-                    
                     // 如果任务完成(成功或失败),结束连接
                     if (in_array($task->status, [
                         'success',
@@ -2630,7 +2512,7 @@ class AnimeController extends BaseController
                                 'error_message' => $task->error_message ? mapErrorMessage($task->error_message) : ''
                             ]
                         ]) . "\n\n";
-                        ob_flush();
+                        if (ob_get_level() > 0) ob_flush();
                         flush();
                         break;
                     }
@@ -2647,7 +2529,7 @@ class AnimeController extends BaseController
                                 'message' => '任务正在队列中执行...'
                             ]
                         ]) . "\n\n";
-                        ob_flush();
+                        if (ob_get_level() > 0) ob_flush();
                         flush();
                         $lastQueueMessageTime = $currentTime;
                     }
@@ -2659,7 +2541,7 @@ class AnimeController extends BaseController
                         'type' => 'error',
                         'message' => '查询任务状态失败: ' . $e->getMessage()
                     ]) . "\n\n";
-                    ob_flush();
+                    if (ob_get_level() > 0) ob_flush();
                     flush();
                     sleep($checkInterval);
                 }
@@ -2674,7 +2556,7 @@ class AnimeController extends BaseController
                         'task_id' => $taskId
                     ]
                 ]) . "\n\n";
-                ob_flush();
+                if (ob_get_level() > 0) ob_flush();
                 flush();
             }
             
@@ -2712,7 +2594,9 @@ class AnimeController extends BaseController
                     'type' => 'error',
                     'message' => $validator->errors()->first()
                 ]) . "\n\n";
-                ob_flush();
+                if (ob_get_level() > 0) {
+                    ob_flush();
+                }
                 flush();
             }, 200, [
                 'Content-Type' => 'text/event-stream',
@@ -2732,7 +2616,9 @@ class AnimeController extends BaseController
                     'type' => 'error',
                     'message' => '分集不存在'
                 ]) . "\n\n";
-                ob_flush();
+                if (ob_get_level() > 0) {
+                    ob_flush();
+                }
                 flush();
             }, 200, [
                 'Content-Type' => 'text/event-stream',
@@ -2816,7 +2702,7 @@ class AnimeController extends BaseController
                     'type' => 'error',
                     'message' => '未找到分镜数据'
                 ]) . "\n\n";
-                ob_flush();
+                if (ob_get_level() > 0) ob_flush();
                 flush();
             }, 200, [
                 'Content-Type' => 'text/event-stream',
@@ -2834,7 +2720,7 @@ class AnimeController extends BaseController
                         'type' => 'error',
                         'message' => '请检查是否有时长为空的片段'
                     ]) . "\n\n";
-                    ob_flush();
+                    if (ob_get_level() > 0) ob_flush();
                     flush();
                 }, 200, [
                     'Content-Type' => 'text/event-stream',
@@ -3097,7 +2983,7 @@ class AnimeController extends BaseController
                         'success_tasks_count' => $total_tasks_count,
                         'episode' => $episode
                     ]) . "\n\n";
-                    ob_flush();
+                    if (ob_get_level() > 0) ob_flush();
                     flush();
                 }, 200, [
                     'Content-Type' => 'text/event-stream',
@@ -3116,7 +3002,7 @@ class AnimeController extends BaseController
                         'type' => 'error',
                         'message' => trim($errorMsg)
                     ]) . "\n\n";
-                    ob_flush();
+                    if (ob_get_level() > 0) ob_flush();
                     flush();
                 }, 200, [
                     'Content-Type' => 'text/event-stream',
@@ -3154,7 +3040,7 @@ class AnimeController extends BaseController
                 'completed_tasks_count' => count($completeTasks),
                 'success_tasks_count' => count($successTasks)
             ]) . "\n\n";
-            ob_flush();
+            if (ob_get_level() > 0) ob_flush();
             flush();
             
             while (time() - $startTime < $maxDuration) {
@@ -3325,7 +3211,7 @@ class AnimeController extends BaseController
                             'completed_tasks_count' => count($completeTasks),
                             'success_tasks_count' => count($successTasks)
                         ]) . "\n\n";
-                        ob_flush();
+                        if (ob_get_level() > 0) ob_flush();
                         flush();
                     }
                     
@@ -3345,7 +3231,7 @@ class AnimeController extends BaseController
                             'success_tasks_count' => count($successTasks),
                             'episode' => $updatedEpisode
                         ]) . "\n\n";
-                        ob_flush();
+                        if (ob_get_level() > 0) ob_flush();
                         flush();
                         break;
                     }
@@ -3365,7 +3251,7 @@ class AnimeController extends BaseController
                         'completed_tasks_count' => count($completeTasks),
                         'success_tasks_count' => count($successTasks)
                     ]) . "\n\n";
-                    ob_flush();
+                    if (ob_get_level() > 0) ob_flush();
                     flush();
                     
                     // 检查是否超时,如果超时则停止循环
@@ -3386,7 +3272,7 @@ class AnimeController extends BaseController
                     'completed_tasks_count' => count($completeTasks),
                     'success_tasks_count' => count($successTasks)
                 ]) . "\n\n";
-                ob_flush();
+                if (ob_get_level() > 0) ob_flush();
                 flush();
             }
             

+ 15 - 5
app/Services/Anime/AnimeService.php

@@ -3807,7 +3807,9 @@ class AnimeService
                     'start_time' => $startTime
                 ]
             ], JSON_UNESCAPED_UNICODE) . "\n\n";
-            ob_flush();
+            if (ob_get_level() > 0) {
+                ob_flush();
+            }
             flush();
 
             // 持续轮询任务状态
@@ -3926,7 +3928,9 @@ class AnimeService
                                     'elapsed_time' => time() - $startTime
                                 ]
                             ], JSON_UNESCAPED_UNICODE) . "\n\n";
-                            ob_flush();
+                            if (ob_get_level() > 0) {
+                                ob_flush();
+                            }
                             flush();
                         } catch (\Exception $e) {
                             dLog('anime')->error('更新角色/场景信息失败: ' . $e->getMessage());
@@ -3970,7 +3974,9 @@ class AnimeService
                                         'elapsed_time' => time() - $startTime
                                     ]
                                 ], JSON_UNESCAPED_UNICODE) . "\n\n";
-                                ob_flush();
+                                if (ob_get_level() > 0) {
+                                    ob_flush();
+                                }
                                 flush();
                             } catch (\Exception $e) {
                                 dLog('anime')->error('强制更新角色/场景信息失败: ' . $e->getMessage());
@@ -4009,7 +4015,9 @@ class AnimeService
                             'total_time' => time() - $startTime
                         ]
                     ], JSON_UNESCAPED_UNICODE) . "\n\n";
-                    ob_flush();
+                    if (ob_get_level() > 0) {
+                        ob_flush();
+                    }
                     flush();
                     break;
                 }
@@ -4048,7 +4056,9 @@ class AnimeService
                         'scenes' => $scenes
                     ]
                 ], JSON_UNESCAPED_UNICODE) . "\n\n";
-                ob_flush();
+                if (ob_get_level() > 0) {
+                    ob_flush();
+                }
                 flush();
             }
         };