#1. Bài toán
Khi bạn đẩy một Job vào Queue trong Laravel, class đó cần được “đóng gói” (serialize) thành chuỗi để đẩy vào Redis/Database, rồi sau đó “mở gói” (unserialize) ở Worker.
#2. Bản chất
serialize(): Biến object thành chuỗi, lưu trữ state và class name.unserialize(): Khôi phục object từ chuỗi. PHP tự động tìm class tương ứng và tạo lại instance.
#3. Các Magic Methods cần biết
__sleep(): Dọn dẹp object trước khi đóng gói (vd: đóng kết nối DB để không serialize connection resource).__wakeup(): Thiết lập lại kết nối/resource ngay khi object được khôi phục.
#4. Rủi ro bảo mật: PHP Object Injection
Nếu bạn unserialize() một chuỗi từ phía user (ví dụ từ cookie hoặc input), hacker có thể truyền vào một chuỗi đại diện cho một class khác trong hệ thống. Khi PHP “mở gói”, nó tự động gọi các method như __destruct của class đó -> Remote Code Execution (RCE).
Bài học: Tuyệt đối không bao giờ dùng unserialize() trên dữ liệu do người dùng nhập vào.
#5. Ứng dụng trong Laravel
Laravel giải quyết vấn đề serialize model bằng SerializesModels Trait. Nó chỉ serialize ID của model thay vì serialize toàn bộ object Model nặng nề. Khi worker chạy, nó sẽ dùng ID để fetch lại dữ liệu mới nhất từ DB.