Bối cảnhGặp phải lỗi này thường chỉ có một ý nghĩa: môi trường PHP của bạn không thể giao tiếp với cơ sở dữ liệu MySQL. Đây là triệu chứng điển hình khi thay đổi phiên bản PHP—ví dụ: nâng cấp từ PHP 7.4 lên 8.3—hoặc khi thiết lập máy chủ mới.
Bản thân thông báo lỗi này hơi cũ kỹ. Mặc dù nó đề cập đến 'MySQL extension', WordPress hiện đại thực sự dựa vào mysqli hoặc pdo_mysql. Kể từ khi driver mysql gốc bị loại bỏ từ PHP 7.0, thông báo chung chung này chỉ là cách WordPress báo rằng nó không tìm thấy cầu nối tương thích đến dữ liệu của bạn.
Quy trình kiểm tra lỗiĐừng vội vàng thay đổi cấu hình một cách mù quáng. Trước tiên, hãy xác minh xem extension có thực sự thiếu trong môi trường PHP của bạn hay không bằng cách chạy lệnh này trong terminal:
php -m | grep -i mysql
Nếu kết quả trả về là một dòng trống, extension đang bị thiếu trong môi trường CLI. Tuy nhiên, một sai lầm phổ biến là giả định rằng terminal và web server sử dụng chung cấu hình. PHP-FPM (web) và PHP-CLI thường có các tệp cấu hình khác nhau. Để xem những gì trình duyệt thấy, hãy tạo một tệp tên là info.php trong thư mục gốc của WordPress:
<?php phpinfo(); ?>
Truy cập yourdomain.com/info.php và tìm kiếm từ khóa "mysqli" hoặc "mysqlnd". Nếu các phần này không tồn tại, extension hiện đang bị vô hiệu hóa hoặc chưa được cài đặt.
Giải pháp### 1. Cài đặt Extension trên LinuxTrên hầu hết các bản phân phối Linux, MySQL extension là một gói riêng biệt. Bạn cần cài đặt gói khớp chính xác với phiên bản PHP đang sử dụng.
Ubuntu / Debian```
Trước tiên hãy tìm phiên bản PHP đang hoạt động
php -v
Nếu bạn dùng PHP 8.1, hãy chạy:
sudo apt update sudo apt install php8.1-mysql
Sau đó khởi động lại dịch vụ
sudo systemctl restart apache2
Đối với người dùng Nginx:
sudo systemctl restart php8.1-fpm
#### CentOS / RHEL / Fedora```
# Các hệ thống dựa trên RHEL hiện đại sử dụng dnf
sudo dnf install php-mysqlnd
sudo systemctl restart httpd
# Đối với thiết lập Nginx/PHP-FPM:
sudo systemctl restart php-fpm
2. Kích hoạt trong php.iniĐôi khi phần mềm đã có sẵn, nhưng tùy chọn kích hoạt lại bị tắt trong tệp cấu hình.
- Tìm đường dẫn
php.ini(xem mục "Loaded Configuration File" trong kết quảphpinfo()).- Tìm dòng;extension=mysqli.- Xóa dấu chấm phẩy (;) ở đầu dòng để kích hoạt:``` extension=mysqli extension=pdo_mysql
Lưu tệp và khởi động lại Apache hoặc PHP-FPM để áp dụng các thay đổi.
### 3. Khắc phục cho môi trường DockerNếu bạn đang chạy image PHP chính thức trên Docker, lệnh `apt-get install` sẽ không có tác dụng với PHP extensions. Bạn phải sử dụng công cụ hỗ trợ `docker-php-ext-install` trong Dockerfile để biên dịch chúng một cách chính xác:
FROM php:8.2-fpm RUN docker-php-ext-install mysqli pdo_mysql
Build lại image sau khi lưu
Nếu bạn đang sử dụng Docker Compose, hãy kiểm tra các biến môi trường của cơ sở dữ liệu. Đôi khi, lỗi kết nối trong các phiên bản WordPress cũ sẽ kích hoạt thông báo "missing extension" gây hiểu nhầm này thay vì lỗi hết hạn kết nối (timeout).
### 4. Windows (WAMP/XAMPP)Đối với các nhà phát triển sử dụng XAMPP trên máy cục bộ, hãy mở Control Panel và nhấp vào 'Config' cạnh Apache để mở `php.ini`. Đảm bảo dòng `extension=mysqli` không bị vô hiệu hóa bởi dấu chú thích. Ngoài ra, hãy kiểm tra kỹ xem `extension_dir` có trỏ đến đúng thư mục `ext` hay không—thường là đường dẫn như `"C:\xampp\php\ext"`.
## Các bước xác minhThành công sẽ trông như thế này:
- **Trên dòng lệnh:** Chạy `php -m | grep mysqli`. Từ `mysqli` sẽ xuất hiện ngay lập tức.- **Trên trình duyệt:** Tải lại trang `info.php`. Bạn sẽ thấy một mục "mysqli" riêng biệt hiển thị phiên bản thư viện Client API.- **Trong WordPress:** Trang web của bạn sẽ tải bình thường. Nếu bạn thấy lỗi "Error establishing a database connection" thay thế, nghĩa là bạn đã sửa được lỗi extension nhưng thông tin đăng nhập DB bị sai.## Những lưu ý quan trọng- **CLI so với Web:** Đừng bao giờ mặc định rằng `php -m` trong terminal hoạt động thì web server cũng vậy. Chúng thường sử dụng các tệp `php.ini` khác nhau.- **Sử dụng Driver gốc:** Luôn ưu tiên `mysqlnd` (MySQL Native Driver). Nó nhanh hơn và sử dụng ít bộ nhớ hơn đáng kể so với `libmysqlclient` cũ.- **Dọn dẹp:** Bảo mật là ưu tiên hàng đầu. Hãy xóa tệp `info.php` ngay sau khi hoàn tất, vì nó là một "mỏ vàng" thông tin cho những kẻ tấn công.

