0

Xử Lý Lỗi "getaddrinfo for db failed: Name does not resolve" Trong Laravel & PHP

Nếu bạn đang làm việc với PHP, đặc biệt là framework Laravel, chắc hẳn ít nhất một lần bạn đã phải đối mặt với dòng lỗi đỏ chót và dài ngoằng này trên màn hình:

SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for db failed: Name does not resolve (SQL: select * from users where id = 1 and users.deleted_at is null limit 1)

Đừng quá lo lắng! Đây là một trong những lỗi phổ biến nhất liên quan đến việc cấu hình kết nối cơ sở dữ liệu. Bài viết này sẽ giúp bạn "bắt mạch" chính xác nguyên nhân và cung cấp giải pháp xử lý dứt điểm.

1. Hiểu Rõ Bản Chất Của Lỗi

Để sửa lỗi hiệu quả, chúng ta cần hiểu hệ thống đang muốn "nói" điều gì qua dòng thông báo trên:

  • SQLSTATE[HY000] [2002]: Đây là mã lỗi tiêu chuẩn của PDO/MySQL chỉ ra rằng không thể thiết lập kết nối tới máy chủ cơ sở dữ liệu.
  • php_network_getaddresses: Hàm của PHP đảm nhận việc phân giải tên miền đang bị lỗi.
  • getaddrinfo for db failed: Name does not resolve: Đây là mấu chốt của vấn đề. Ứng dụng của bạn đang cố gắng kết nối tới một máy chủ có tên là db, nhưng hệ thống (DNS) không thể dịch cái tên db này thành một địa chỉ IP hợp lệ để kết nối tới.

Tóm lại: Ứng dụng PHP của bạn bị "mù đường" khi tìm đến nhà của Database.

2. Các Nguyên Nhân Phổ Biến & Cách Khắc Phục

Tùy thuộc vào môi trường phát triển (Development Environment) bạn đang sử dụng, nguyên nhân và cách xử lý sẽ khác nhau. Hãy kiểm tra các trường hợp dưới đây:

Trường Hợp 1: Chạy môi trường Local thuần (XAMPP, Laragon, MAMP...)

Đây là lỗi kinh điển đối với những ai mới bắt đầu hoặc vừa clone một dự án sử dụng Docker về máy nhưng lại chạy nó bằng XAMPP/Laragon. Trong môi trường máy chủ cục bộ bình thường, máy tính của bạn không hiểu Host db là gì. Nó chỉ nhận diện được localhost hoặc địa chỉ IP loopback.

Cách khắc phục:

  1. Mở file .env ở thư mục gốc của dự án.
  2. Tìm đến khối cấu hình Database.
  3. Thay đổi giá trị của DB_HOST từ db thành 127.0.0.1 hoặc localhost.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1     <-- Sửa tại đây
DB_PORT=3306
DB_DATABASE=your_database_name
DB_USERNAME=root
DB_PASSWORD=

Trường Hợp 2: Đang sử dụng Docker (Laravel Sail, Docker Compose...)

Nếu bạn đang dùng Docker, việc thiết lập DB_HOST=db là hoàn toàn hợp lý (bởi các container giao tiếp với nhau qua tên service). Tuy nhiên, lỗi vẫn xảy ra do 2 nguyên nhân sau:

Vấn đề 2.1: Tên Service Database không khớp Mở file docker-compose.yml của bạn ra và kiểm tra xem khối cấu hình cho database đang được đặt tên là gì. Có thể nó được đặt tên là mysql, mariadb hoặc postgres thay vì db.

  • Cách khắc phục: Đổi DB_HOST trong file .env cho khớp với tên service trong file docker-compose.
# Nếu service trong docker-compose.yml tên là mysql
DB_HOST=mysql

Vấn đề 2.2: Container Database chưa được khởi động Container chứa Database của bạn có thể đã bị "chết" hoặc chưa được bật lên, khiến container chứa code PHP không tìm thấy.

  • Cách khắc phục: Mở Terminal/Command Prompt và chạy lệnh để khởi động lại các container:
# Đối với Docker Compose thông thường
docker-compose up -d

# Đối với Laravel Sail
./vendor/bin/sail up -d

Trường Hợp 3: "Bóng ma" Cache cấu hình (Đặc sản Laravel)

Đây là trường hợp gây ức chế nhất. Bạn đã áp dụng đúng các cách trên, kiểm tra file .env kỹ càng nhưng Laravel vẫn báo lỗi getaddrinfo for db failed.

Nguyên nhân là do Laravel đang đọc các file cấu hình cũ đã được lưu trong bộ nhớ tạm (Cache) để tối ưu tốc độ, thay vì đọc nội dung mới nhất trong file .env.

Cách khắc phục: Mở Terminal tại thư mục gốc của dự án và chạy dòng lệnh sau để dọn dẹp bộ nhớ đệm cấu hình:

php artisan config:clear

Mẹo nhỏ: Sau khi clear config, bạn nên chạy thêm lệnh php artisan serve lại từ đầu (nếu không dùng Docker) để đảm bảo server nhận cấu hình mới.

3. Lời Khuyên Để Tránh Lỗi Tương Tự

  • Hiểu rõ môi trường đang chạy: Luôn ý thức được mình đang code trên môi trường nào (Local thuần hay Docker) để cấu hình DB_HOST cho chuẩn xác.
  • Đừng quên xóa Cache: Biến việc chạy lệnh php artisan config:clear thành thói quen mỗi khi bạn thay đổi bất kỳ dòng nào trong file .env.
  • Kiểm tra logs: Nếu các bước trên không giải quyết được, hãy tập thói quen đọc file storage/logs/laravel.log để xem có lỗi nào ẩn sâu bên trong ngăn cản việc khởi tạo kết nối hay không.

Hy vọng bài viết này đã giúp bạn khắc phục thành công lỗi Name does not resolve và tiếp tục công việc coding của mình một cách thuận lợi!


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í