アプリケーションでの同時操作の管理には、競合を防ぐために慎重に同期する必要があります。 Laravelのキャッシュロックメカニズムは、ファイルのアップロード、Webhook処理、バックグラウンドタスクなどのシナリオを効果的に処理するための堅牢なソリューションを提供します。 このシステムは、複数のサーバー、プロセス、キューワーカーでシームレスに機能する分散ロックを作成し、分散環境での人種条件を防止します。
キャッシュロックを実装する方法:
use Illuminate\Support\Facades\Cache; $lock = Cache::lock('process-payment', 120); // Creates a lock named 'process-payment' lasting 120 seconds if ($lock->get()) { // Payment processing logic here. The lock is automatically released after 120 seconds. }
を説明しましょう
<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Cache; use App\Jobs\ProcessWebhook; use Illuminate\Http\Request; use Log; use Exception; class WebhookController extends Controller { public function handle(Request $request) { $webhookId = $request->input('webhook_id'); $lockName = "webhook-{$webhookId}"; $lock = Cache::lock($lockName, 60); try { if (!$lock->get()) { Log::info("Webhook {$webhookId} is already being processed"); return response()->json(['message' => 'Webhook is being processed'], 409); } $this->validateWebhook($request); // Validation step ProcessWebhook::dispatch($request->all(), $lock->owner())->onQueue('webhooks'); return response()->json(['message' => 'Webhook accepted', 'processing_id' => $lock->owner()]); } catch (Exception $e) { $lock?->release(); throw $e; } } } class ProcessWebhook implements ShouldQueue { public function __construct(private array $payload, private string $lockOwner) {} public function handle() { $lock = Cache::restoreLock("webhook-{$this->payload['webhook_id']}", $this->lockOwner); try { $this->processWebhookPayload(); // Webhook processing logic } finally { $lock->release(); // Ensure lock release even on errors } } }
以上がLaravelキャッシュロックとの処理プロセスの同期の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。