historyId = $historyId; } /** * Execute the job. * * @return void */ public function handle() { $history = ProcessHistories::find($this->historyId); if (!$history) { return; } $startQueue = now(); // Допустим тут время ожидания очереди (между startQueue и started_at) $queueWaitTime = $startQueue->diffInSeconds($history->started_at); // Эмуляция обработки // 1. Загрузка файлов (у нас уже загружены локально, можно считать что это этап) $uploadTime = rand(1,3); // псевдо sleep($uploadTime); // 2. Запрос к внешнему API для обработки каждого изображения $processingStart = now(); $processedCount = 0; foreach ($history->images as $index => $img) { // Имитируем обращение к API sleep(2); // эмуляция API задержки $processedCount++; $history->processed_count = $processedCount; $history->save(); } $processingTime = $processingStart->diffInSeconds(now()); // 3. Сохранение итогового step-файла $savingStart = now(); // Имитируем сохранение файла (например API возвращает имя файла) $stepFileName = 'step_' . time() . '.txt'; Storage::disk('public')->put($stepFileName, "Данные шага обработки."); $savingTime = $savingStart->diffInSeconds(now()); $history->step_file_name = $stepFileName; $history->finished_at = now(); $history->stages_timing = [ 'queue_wait_time' => $queueWaitTime, 'upload_time' => $uploadTime, 'processing_time' => $processingTime, 'saving_time' => $savingTime ]; $history->save(); } }