checkUlid, 75)->block(1, function () use ($registry, $persister, $activation, $budget, $circuit, $audit) { $c = SerpCheck::where('ulid', $this->checkUlid)->firstOrFail(); if (in_array($c->status, [SerpCheckStatus::Completed, SerpCheckStatus::Failed], true)) { return; }if ($c->execution_mode !== 'live') { SubmitSerpCheck::dispatch($c->ulid)->onQueue(config('serp.queue')); return; }if ($c->status === SerpCheckStatus::Pending && ! $c->begin()) { return; }$started = microtime(true); try { if ($c->provider === 'dataforseo') { $activation->assertPaid(); $circuit->assertClosed(); $budget->reserve('check:'.$c->ulid, 'live', $c->id); }$audit->record('live_request_started', ['check_ulid' => $c->ulid, 'provider' => $c->provider, 'mode' => 'live']); $response = $registry->resolve($c->provider)->search(new SerpQuery($c->phrase, $c->search_engine->value, $c->country_code, $c->language_code, $c->device->value, 10)); if ($c->provider === 'dataforseo') { $budget->reconcile('check:'.$c->ulid, $response->cost, $response->referenceId); $circuit->success(); }$persister->complete($c, $response, ['provider_cost' => $response->cost, 'provider_cost_currency' => $response->currency, 'provider_status_code' => $response->statusCode, 'duration_ms' => (int) ((microtime(true) - $started) * 1000)]); $audit->record('live_request_completed', ['check_ulid' => $c->ulid, 'provider' => $c->provider, 'mode' => 'live', 'duration_ms' => (int) ((microtime(true) - $started) * 1000), 'result_count' => count($response->results)]); } catch (SerpProviderException $e) { if ($c->provider === 'dataforseo') { $circuit->failure($e); }$audit->record('live_request_failed', ['check_ulid' => $c->ulid, 'error_category' => $e->safeCode()]); if ($e->retryable()) { throw $e; }$c->fail($e->safeCode(), $e->safeMessage()); } catch (Throwable) { $c->fail('unexpected_error', 'SERP kontrolü tamamlanamadı.'); } }); } public function failed(?Throwable $e): void { $c = SerpCheck::where('ulid', $this->checkUlid)->first(); if ($c && $e instanceof SerpProviderException) { $c->fail($e->safeCode(), $e->safeMessage()); } elseif ($c) { $c->fail('job_failed', 'SERP kontrolü tamamlanamadı.'); } } public function tags(): array { return ['serp-check:'.$this->checkUlid, 'serp-mode:live']; } }