Cross-Process Lock Management in Laravel

Cross-Process Lock Management in Laravel

Working with locks across different processes? Laravel's Cache lock system lets you acquire, restore, and release locks seamlessly across requests and jobs! Let's explore this powerful feature.

Basic Lock Management

Here's how to handle locks between processes:

$lock = Cache::lock('processing', 120);

if ($lock->get()) {
    ProcessPodcast::dispatch($podcast, $lock->owner());
}

Restoring Locks in Jobs

Restore and release the lock in your job:

Cache::restoreLock('processing', $this->owner)->release();

Real-World Example

Here's a practical implementation for processing large files:

class FileUploadController extends Controller
{
    public function process(Request $request)
    {
        $file = $request->file('document');
        $lockName = 'process-file-' . $file->hashName();
        
        $lock = Cache::lock($lockName, 300);  // 5 minutes
        
        if ($lock->get()) {
            // Initial quick validation
            $this->validateFile($file);
            
            // Dispatch processing job with lock owner
            ProcessLargeFile::dispatch(
                $file->store('temp'),
                $lock->owner()
            );
            
            return response()->json([
                'message' => 'File processing started',
                'job_id' => $lockName
            ]);
        }
        
        return response()->json([
            'message' => 'File is already being processed'
        ], 409);
    }
}

class ProcessLargeFile implements ShouldQueue
{
    public function __construct(
        private string $filePath,
        private string $lockOwner
    ) {}
    
    public function handle()
    {
        try {
            // Process the file
            $this->processChunks();
            
        } finally {
            // Always release the lock
            Cache::restoreLock('process-file', $this->lockOwner)
                ->release();
        }
    }
    
    private function processChunks()
    {
        // Processing logic here
    }
}

Cross-process lock management ensures your application handles concurrent operations safely and efficiently.

If this guide was helpful to you, subscribe to my daily newsletter and give me a follow on X/Twitter. It helps a lot!

Subscribe to Harris Raftopoulos

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe