laravel/octane
Laravel Octane accelerates Laravel by running it on high-performance app servers like FrankenPHP, Open Swoole/Swoole, and RoadRunner. It boots your app once, keeps it in memory, and serves requests rapidly for better throughput and latency.
Laravel Octane is a high-performance application server designed to replace PHP-FPM in Laravel deployments. It leverages event-driven, asynchronous servers (Swoole, RoadRunner, FrankenPHP, OpenSwoole) to:
Key Fit Criteria: ✅ High-traffic APIs/SPAs: Ideal for Laravel apps with >1000 RPS or WebSocket-heavy workloads. ✅ Microservices: Enables low-latency responses via async workers. ✅ Hybrid Deployments: Supports Docker/Kubernetes (via RoadRunner/FrankenPHP). ❌ Not for CPU-bound tasks: PHP workers are still single-threaded; offload heavy tasks to queues.
| Component | Feasibility | Notes |
|---|---|---|
| Laravel Core | ⭐⭐⭐⭐⭐ | Zero config for basic usage; CLI (php artisan octane:start). |
| Queues | ⭐⭐⭐⭐ | Supports Swoole/Redis queues natively; may need tuning for high volume. |
| Database | ⭐⭐⭐⭐ | Connection pooling works, but Docker/K8s restarts may leak connections. |
| Caching | ⭐⭐⭐⭐⭐ | Redis/Memcached work as-is; no opcache conflicts. |
| WebSockets | ⭐⭐⭐⭐⭐ | Native support via RoadRunner/FrankenPHP (e.g., Laravel Echo). |
| File Uploads | ⭐⭐⭐ | Swoole-specific fixes required (e.g., FlushUploadedFiles listener). |
| Vite/Livewire | ⭐⭐⭐⭐ | Works, but per-request state (e.g., Vite HMR) may need adjustments. |
Critical Dependencies:
| Risk Area | Severity | Mitigation |
|---|---|---|
| Worker Process Isolation | High | Misconfigured workers (e.g., memory leaks) can crash the app. Monitor with octane:monitor. |
| Database Connection Leaks | Medium | Docker/K8s restarts may leave stale connections. Use DB::disconnect() hooks. |
| Async Bugs | Medium | Race conditions in queues/sessions (e.g., Swoole’s shared memory). Test with octane:test. |
| Vendor Lock-in | Low | FrankenPHP/RoadRunner are optional; Swoole/OpenSwoole are PHP extensions. |
| Debugging Complexity | High | No Xdebug in workers; use APP_DEBUG=true + FrankenPHP’s admin UI. |
Key Questions for TPM:
| Stack Component | Compatibility | Recommendation |
|---|---|---|
| PHP Version | 8.1–8.5 | Use PHP 8.5 for latest Octane features (e.g., partitioned cookies). |
| Laravel Version | 10–13 | Test with Laravel 13 (latest stable). |
| Server | Linux (Docker/K8s) | FrankenPHP (easiest) or RoadRunner (most flexible). |
| Database | MySQL/PostgreSQL | Connection pooling enabled; avoid persistent connections. |
| Cache | Redis/Memcached | No changes needed; Octane handles shared memory. |
| Queue | Swoole/Redis | Swoole queues for lowest latency; Redis for distributed setups. |
| Monitoring | Prometheus/Grafana | Use FrankenPHP’s metrics or RoadRunner’s stats. |
Phase 1: Proof of Concept (PoC)
composer.json:
composer require laravel/octane
php artisan octane:install frankenphp
php artisan octane:install roadrunner
php artisan octane:start
ab or k6.octane:monitor).Phase 2: Staging Rollout
Dockerfile:
FROM laravel/octane:frankenphp
COPY . /var/www/html
WORKDIR /var/www/html
RUN composer install --optimize-autoloader
config/octane.php:
'workers' => [
'connections' => [
'http' => [
'options' => [
'worker_concurrency' => 10, // Match CPU cores
'max_requests' => 1000, // Restart workers after X requests
],
],
],
],
AppServiceProvider:
public function boot(): void
{
if (app()->runningInConsole()) return;
DB::disconnect();
}
http://localhost:26153) or RoadRunner’s CLI.Phase 3: Production Cutover
APP_SERVER=php-fpm env var to fallback.storage/logs/octane-error.log).| Feature | Status | Notes |
|---|---|---|
| Laravel Queues | ✅ Fully Supported | Swoole queues work best; Redis queues need tuning. |
| Laravel Echo (WebSockets) | ✅ Native Support | Works with RoadRunner/FrankenPHP. |
| Livewire | ✅ Works | Per-request state may need Vite::share() adjustments. |
| Inertia.js | ✅ Works | No changes needed. |
| Horizon | ⚠️ Partial Support | Swoole queues may conflict; use Redis queues for Horizon. |
| Telescope | ❌ Not |
How can I help you explore Laravel packages today?