Bạn có biết mỗi khi một request HTTP đến, PHP-FPM phải load lại toàn bộ framework, đọc hàng trăm file config, khởi tạo Service Providers? Laravel Octane sinh ra để chấm dứt sự lãng phí tài nguyên này.
#1. Cơ chế hoạt động: Từ “Request-based” sang “Worker-based”
Trong mô hình PHP-FPM truyền thống, PHP là một ngôn ngữ “Shared-nothing”: mỗi request là một thế giới riêng, chạy xong rồi chết (stateless).
Laravel Octane thay đổi luật chơi bằng cách chạy ứng dụng dưới dạng Worker.
- Nó boot Laravel framework duy nhất 1 lần và giữ toàn bộ instance đó trong RAM.
- Khi có request đến, Worker chỉ việc thực thi logic nghiệp vụ (Controller/Action) và trả về kết quả ngay lập tức.
- Kết quả: Tốc độ phản hồi cực nhanh (thường < 10ms) và chịu tải cực lớn (High Throughput).
#2. Swoole vs RoadRunner: Chọn phe nào?
Octane hỗ trợ 2 “động cơ” chính:
- Swoole (PHP Extension): Viết bằng C, tích hợp sâu vào PHP. Nó biến PHP thành một ngôn ngữ đa luồng (multi-threaded) và hỗ trợ lập trình bất đồng bộ (Coroutines). Thích hợp cho các task IO nặng như gọi nhiều API cùng lúc.
- RoadRunner (Binary Go): Một ứng dụng viết bằng Go làm Proxy đứng trước PHP. Nó giao tiếp với PHP qua Unix Sockets hoặc TCP. Ưu điểm là cực kỳ ổn định, dễ cấu hình và không cần cài thêm PHP Extension đặc thù.
#3. “Hố tử thần”: Vấn đề về State Management
Vì ứng dụng nằm trong RAM mãi mãi, bạn không còn sự bảo vệ của mô hình “Shared-nothing”. Đây là nơi các bug Senior xuất hiện:
#3.1 Memory Leak
Nếu bạn thêm một phần tử vào mảng static trong class ở mỗi request, mảng đó sẽ to dần lên theo thời gian và làm server hết RAM (OOM).
#3.2 State Leak (Rò rỉ dữ liệu)
Hãy tưởng tượng User A đăng nhập, bạn lưu thông tin user vào một Singleton Service. Request của User B đến ngay sau đó và Worker đó vẫn đang giữ dữ liệu của User A. User B bỗng dưng thấy mình đang ở trong tài khoản của User A. Cực kỳ nguy hiểm!
#4.Câu hỏi nhanh
Câu hỏi: Làm thế nào để đảm bảo một Singleton Service trong Laravel Octane được “reset” lại trạng thái sau mỗi request?
Trả lời: Laravel Octane cung cấp cơ chế reset tự động cho một số service core. Tuy nhiên với service của bạn, bạn có 2 cách:
- Sử dụng
terminatingcallback: Đăng ký trong Service Provider để dọn dẹp data khi request kết thúc. - Khai báo trong
config/octane.php: Thêm class của bạn vào mảngflush. Octane sẽ tự động xóa instance đó khỏi Container sau mỗi request, ép buộc Laravel phải khởi tạo lại từ đầu cho request sau.
#5. Kết luận
Laravel Octane là bước nhảy vọt về hiệu năng. Tuy nhiên, nó đòi hỏi lập trình viên phải có tư duy về Memory Management và Stateless Architecture. Đừng dùng Octane nếu bạn chưa hiểu rõ cách quản lý biến Static trong PHP.