0

GIẢI MÃ LỖI FAILED TO OPEN STREAM: NO SUCH FILE OR DIRECTORY TRONG LARAVEL

1. Bản Chất Của Lỗi Này Là Gì? (The What)

Nhìn vào dòng thông báo, PHP đang cố gắng thực thi hàm file_put_contents() để ghi một tập tin cache (có mã hash dài) vào đường dẫn cụ thể bên trong thư mục storage/framework/cache/data/62/84/.

Tuy nhiên, nó văng lỗi No such file or directory (Không tìm thấy tập tin hoặc thư mục).

Lý do cực kỳ đơn giản: Thư mục con 62/84 bên trong hệ thống lưu trữ cache chưa từng tồn tại trên ổ cứng, và bản thân PHP/Laravel không tự động tạo ra thư mục đa cấp đó kịp thời điểm cần ghi file, dẫn đến việc tiến trình ghi bị sập.


2. Nguyên Nhân Gốc Rễ (The Why)

Lỗi này thường xuất hiện do 3 thủ phạm chính trong quá trình vận hành:

  • Thủ phạm 1: Thiếu quyền ghi (Permission Issue) - Phổ biến nhất. Web server (thường chạy dưới user www-data hoặc nginx) không có quyền ghi dữ liệu vào thư mục storage/ mà bạn vừa mới clone về từ Git hoặc vừa giải nén. Khi không có quyền write, Laravel cố gắng tạo thư mục con nhưng bất thành, cuối cùng văng lỗi Failed to open stream.
  • Thủ phạm 2: Chạy lệnh Artisan bằng quyền Root. Bạn vừa chạy một lệnh nào đó bằng quyền siêu người dùng (sudo php artisan ...). Điều này làm cho các thư mục cache sinh ra sau đó bị gắn nhãn sở hữu (owner) là root. Sau đó, khi Web Server (chạy bằng www-data) truy cập vào và muốn ghi đè hoặc tạo thư mục con bên trong, nó bị từ chối quyền và sập.
  • Thủ phạm 3: Thư mục storage bị thiếu hẳn cấu trúc. Trong file .gitignore chuẩn của Laravel, toàn bộ thư mục storage/framework/cache đều bị bỏ qua (không đẩy lên Git). Khi kéo code về máy mới hoặc server mới, các thư mục con bên trong hoàn toàn trống rỗng.

3. Cách Xử Lý Triệt Để (The How)

Để dứt điểm lỗi này, bạn chỉ cần thực hiện 2 bước kinh điển sau trên Terminal của Server (hoặc môi trường Local):

Bước 1: Cấp lại quyền sở hữu chuẩn mực cho Web Server

Đảm bảo rằng toàn bộ thư mục dự án thuộc quyền quản lý của user chạy web (ví dụ www-data trên Ubuntu/Nginx):

# Thay www-data bằng user thực tế chạy web server trên máy của bạn
sudo chown -R www-data:www-data /var/www/html

Bước 2: Thiết lập lại quyền đọc/ghi (Permissions)

Cấp quyền đọc/ghi cho thư mục storagebootstrap/cache:

sudo chmod -R 775 /var/www/html/storage
sudo chmod -R 775 /var/www/html/bootstrap/cache

Bước 3: Dọn dẹp cache cũ và khởi động lại

Đôi khi các file cache cũ bị lỗi phân quyền rác, hãy xóa sạch chúng đi để Laravel tự tạo lại cấu trúc sạch sẽ:

php artisan optimize:clear

💡 Lời Kết

Lỗi Failed to open stream liên quan đến storage không bao giờ là lỗi cú pháp code, mà thuần túy là vấn đề của hệ điều hành và phân quyền (Permissions). Nhớ nguyên tắc vàng khi dựng môi trường Laravel: Thư mục storagebootstrap/cache luôn phải ở trạng thái "mở cửa" cho phép Web Server thoải mái đọc ghi.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí