Cài đặt mcrypt cho PHP 7.2 trên DirectAdmin
Hướng dẫn DirectAdmin · cập nhật 23/08/2026
Để cài mcrypt cho PHP 7.2 trên DirectAdmin, bạn tải mã nguồn extension từ PECL, biên dịch bằng bộ công cụ của chính bản PHP 7.2 đang chạy, rồi khai báo nó trong file cấu hình riêng. Mất khoảng 5 phút, cần quyền root qua SSH.
Việc này chỉ cần khi bạn còn một mã nguồn cũ gọi các hàm mcrypt_encrypt, mcrypt_decrypt và website báo lỗi hàm không tồn tại sau khi nâng PHP lên 7.2.
- Tải mã nguồn extension từ kho PECL.
- Giải nén rồi chuẩn bị môi trường biên dịch bằng phpize của bản PHP 7.2.
- Biên dịch và cài đặt.
- Khai báo extension vào file cấu hình riêng rồi khởi động lại PHP-FPM.
- Kiểm tra extension đã nạp.
Nhóm phát triển PHP đánh dấu extension này là lỗi thời từ PHP 7.1 và gỡ khỏi lõi ở PHP 7.2, đẩy sang PECL. Thư viện nền libmcrypt phía dưới ngừng cập nhật từ năm 2007. Bài này giữ cho máy chủ cũ đang chạy mã nguồn chưa chuyển đổi được, không nên dùng cho dự án mới.
Vì sao PHP 7.2 không còn mcrypt sẵn trong lõi
Từ PHP 7.2, extension này bị gỡ khỏi mã nguồn PHP và chuyển sang kho PECL. Lý do là thư viện libmcrypt mà nó bọc bên ngoài đã ngừng phát triển từ 2007, không còn ai vá lỗi và không hỗ trợ các thuật toán mã hoá đời mới. PHP 7.1 chỉ cảnh báo lỗi thời, tới 7.2 thì gỡ hẳn.
Hệ quả là sau khi nâng PHP lên 7.2, mọi lời gọi hàm mcrypt trong mã nguồn đều ném lỗi Call to undefined function mcrypt_encrypt(). Website trắng trang hoặc trả về lỗi 500 tuỳ cấu hình hiển thị lỗi. Một lỗi build khác hay đi kèm khi nâng PHP trên máy chủ cũ nằm ở bài sửa lỗi libzip khi build PHP trên DirectAdmin.
Nên cài lại extension hay chuyển mã nguồn sang OpenSSL
Cài lại extension cho website chạy được ngay nhưng chỉ là cách hoãn. Chuyển mã nguồn sang OpenSSL hoặc Sodium mất công hơn nhưng dứt điểm, vì hai thư viện đó còn được cập nhật và có sẵn trong PHP. Bảng dưới đây để chọn theo tình huống đang gặp.
| Tiêu chí | Cài lại qua PECL | Chuyển mã nguồn sang OpenSSL |
|---|---|---|
| Thời gian | Khoảng 5 phút | Vài giờ tới vài ngày tuỳ mã nguồn |
| Cần sửa mã nguồn | Không | Có, phải viết lại phần mã hoá |
| Dữ liệu đã mã hoá cũ | Đọc lại được ngay | Phải giải mã bằng thư viện cũ rồi mã hoá lại |
| Còn nhận bản vá bảo mật | Không, libmcrypt ngừng từ 2007 | Có |
| Dùng được với PHP 8 | Không, extension không biên dịch nổi | Có |
| Nên chọn khi | Website đang chết, cần chạy lại gấp | Có kế hoạch nâng PHP lên 8 trong năm nay |
Cách cài mcrypt cho PHP 7.2 trên DirectAdmin
Năm bước dưới đây chạy bằng quyền root qua SSH. Điểm mấu chốt là mọi lệnh đều gọi công cụ nằm trong /usr/local/php72, không gọi pecl hay phpize chung của hệ thống. Gọi nhầm thì extension biên dịch ra cho bản PHP khác và PHP 7.2 không nạp được.
1. Xoá mã nguồn còn sót của lần trước
cd /usr/local/src
rm -rf mcrypt-*
Bước này tránh việc phpize gặp file cấu hình cũ của lần biên dịch trước rồi báo lỗi lạ.
2. Tải mã nguồn từ PECL
/usr/local/php72/bin/pecl channel-update pecl.php.net
/usr/local/php72/bin/pecl download mcrypt || /usr/local/php72/bin/pecl download channel://pecl.php.net/mcrypt-1.0.1
Lệnh đầu làm mới danh mục gói. Lệnh sau tải bản mới nhất, hỏng thì tự chuyển sang tải thẳng bản 1.0.1 nhờ dấu hai gạch đứng. Bản 1.0.1 là bản ổn định cho nhánh PHP 7.2.
3. Giải nén và biên dịch
tar -zxvf mcrypt-*.tgz && cd mcrypt-*/
/usr/local/php72/bin/phpize
./configure --with-php-config=/usr/local/php72/bin/php-config
make && make install
Tham số --with-php-config là chỗ dễ sai nhất. Nó chỉ cho trình biên dịch biết lấy thông tin của bản PHP 7.2 chứ không phải bản PHP mặc định của máy. Máy chủ DirectAdmin thường cài song song nhiều bản PHP nên phải khai rõ đường dẫn.
4. Khai báo extension
echo "extension=mcrypt.so" >> /usr/local/php72/lib/php.conf.d/90-custom.ini
Ghi vào file 90-custom.ini chứ không sửa thẳng php.ini. CustomBuild ghi đè php.ini mỗi lần build lại PHP, còn thư mục php.conf.d thì nó giữ nguyên. Sau đó khởi động lại PHP-FPM và web server để cấu hình có hiệu lực.
5. Kiểm tra extension đã nạp
/usr/local/php72/bin/php -i | grep ^mcrypt
Kết quả đúng có dạng:
mcrypt
mcrypt support => enabled
mcrypt_filter support => enabled
mcrypt.algorithms_dir => no value => no value
mcrypt.modes_dir => no value => no value
Dòng mcrypt support => enabled là dấu hiệu extension đã nạp thành công. Mở lại website để chắc nó hết báo lỗi hàm không tồn tại.
Xử lý các lỗi thường gặp khi biên dịch
Bốn tình huống dưới đây chiếm phần lớn ca thất bại. Mỗi tình huống có thông báo riêng nên nhìn dòng lỗi là biết rơi vào ca nào.
Báo mcrypt.h not found. Máy thiếu thư viện nền và phần header của nó. Cài bằng yum install libmcrypt libmcrypt-devel trên CentOS hoặc apt install libmcrypt-dev trên Ubuntu, rồi chạy lại từ bước 3. Kho chính thức CentOS 7 không có gói này, phải bật kho EPEL trước.
Báo phpize: command not found. Đường dẫn PHP 7.2 trên máy không phải /usr/local/php72. Chạy ls /usr/local/ | grep php để xem tên thư mục thật rồi thay vào cả năm bước.
Biên dịch xong nhưng php -i không thấy dòng nào. File .ini ghi sai chỗ hoặc chưa khởi động lại PHP-FPM. Chạy /usr/local/php72/bin/php --ini để xem PHP thật sự đang đọc những file nào, đối chiếu với đường dẫn vừa ghi.
Mất extension sau khi build lại PHP. CustomBuild dựng lại PHP từ đầu và không giữ extension cài tay. Chạy lại toàn bộ năm bước sau mỗi lần build PHP. Các extension có sẵn thì bật nhanh hơn qua giao diện, xem bài bật tắt extension PHP trên DirectAdmin.
Chuyển mã nguồn khỏi thư viện cũ trước khi lên PHP 8
Extension này không biên dịch được trên PHP 8, nên mọi website còn gọi các hàm này sẽ chặn đường nâng cấp. PHP 7.2 hết hỗ trợ bảo mật từ 30/11/2020, tức máy chủ đang chạy bản này đã hơn năm năm không nhận bản vá cho lõi PHP.
Hướng thay thế là openssl_encrypt và openssl_decrypt cho mã hoá đối xứng, hoặc bộ hàm Sodium có sẵn từ PHP 7.2 cho dự án viết mới. Điểm cần chú ý khi chuyển: thư viện cũ đệm dữ liệu bằng byte rỗng còn OpenSSL đệm theo chuẩn PKCS7, nên dữ liệu đã mã hoá phải giải mã bằng chính nó rồi mã hoá lại bằng thư viện mới, không đọc chéo được. Làm việc đó trước khi gỡ extension, không thì mất dữ liệu cũ.