laravel-infrastructure

from anilcancakir/my-claude-code

Production-grade Claude Code setup: plugins, MCP servers, skills, and performance optimizations.

3 stars0 forksUpdated Jan 26, 2026
npx skills add https://github.com/anilcancakir/my-claude-code --skill laravel-infrastructure

SKILL.md

Laravel Infrastructure

Horizon, Octane, Reverb, Redis, and PostgreSQL patterns for Laravel 12+.

Horizon (Queue Management)

Installation

composer require laravel/horizon
php artisan horizon:install
php artisan migrate

Configuration

// config/horizon.php
'environments' => [
    'production' => [
        'supervisor-1' => [
            'connection' => 'redis',
            'queue' => ['default', 'high', 'low'],
            'balance' => 'auto',
            'maxProcesses' => 10,
            'minProcesses' => 1,
            'memory' => 128,
            'tries' => 3,
            'timeout' => 60,
        ],
    ],
    'local' => [
        'supervisor-1' => [
            'connection' => 'redis',
            'queue' => ['default'],
            'balance' => 'simple',
            'processes' => 3,
            'tries' => 3,
        ],
    ],
],

Running Horizon

# Development
php artisan horizon

# Production (with Supervisor)
# /etc/supervisor/conf.d/horizon.conf
[program:horizon]
process_name=%(program_name)s
command=php /var/www/app/artisan horizon
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stdout_logfile=/var/www/app/storage/logs/horizon.log
stopwaitsecs=3600

Dispatching Jobs

// Dispatch to specific queue
ProcessOrder::dispatch($order)->onQueue('high');

// Delayed dispatch
ProcessOrder::dispatch($order)->delay(now()->addMinutes(5));

// Chain jobs
Bus::chain([
    new ProcessOrder($order),
    new SendConfirmation($order),
    new NotifyWarehouse($order),
])->dispatch();

Octane (High Performance)

Installation

composer require laravel/octane
php artisan octane:install

# Choose: Swoole or RoadRunner

Running

# Development
php artisan octane:start --watch

# Production
php artisan octane:start --workers=4 --task-workers=6

Important: Memory Leaks

// AVOID: Static properties accumulating data
class BadService
{
    private static array $cache = [];  // Memory leak!
}

// GOOD: Use request-scoped or proper cache
class GoodService
{
    public function __construct(
        private readonly Repository $cache
    ) {}
}

Octane-Safe Patterns

// Reset singletons between requests
// AppServiceProvider
public function register(): void
{
    $this->app->singleton(ShoppingCart::class, function ($app) {
        return new ShoppingCart();
    });
}

// In Octane config
'flush' => [
    ShoppingCart::class,
],

Reverb (WebSockets)

Installation

composer require laravel/reverb
php artisan reverb:install

Configuration

BROADCAST_DRIVER=reverb
REVERB_APP_ID=my-app
REVERB_APP_KEY=my-key
REVERB_APP_SECRET=my-secret
REVERB_HOST=localhost
REVERB_PORT=8080

Running

php artisan reverb:start

Broadcasting Events

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;

class OrderStatusUpdated implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets;

    public function __construct(
        public Order $order
    ) {}

    public function broadcastOn(): array
    {
        return [
            new Channel('orders.' . $this->order->id),
        ];
    }

    public function broadcastAs(): string
    {
        return 'status.updated';
    }
}

Frontend (Laravel Echo)

Echo.channel('orders.123')
    .listen('.status.updated', (event) => {
        console.log('Order status:', event.order.status);
    });

Redis

Caching

use Illuminate\Support\Facades\Cache;

// Store
Cache::put('key', 'value', now()->addMinutes(10));
Cache::forever('key', 'value');

// Retrieve
$value = Cache::get('key', 'default');
$value = Cache::remember('key', 60, fn () => expensive());

// Remove
Cache::forget('key');
Cache::flush();

// Tags
Cache::tags(['users', 'orders'])->put('user:1:orders', $orders, 60);
Cache::tags(['users'])->flush();

Sessions

SESSION_DRIVER=redis

Locks

$lock = Cache::lock('processing-order-' . $orderId, 10);

if ($lock->get()) {
    try {
        // Process order
    } finally {
        $lock->release();
    }
}

PostgreSQL

Configuration

DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=myapp
DB_USERNAME=postgres
DB_PASSWORD=secret

PostgreSQL-Specific Features

// JSONB columns
Schema::create('settings', function (Blueprint $table) {
    $table->id();
    $table->jsonb('data')->default('{}');
    $table->index('data', 'settings_data_gin')->using('gin');
});

// Query JSONB
$users = User::whereJsonContains('settings->notifications', 'email')->get();
$users = User::where('settings->theme', 'dark')->get();

// Full-text search
$products = Product::whereFullText('name', 'laptop')->get();

References

| To

...

Read full content

Repository Stats

Stars3
Forks0
LicenseMIT License