Quản Lý Các Phiên Bản PHP trên Linux
Giới Thiệu
Trong quá trình phát triển web, đôi khi bạn cần làm việc với nhiều dự án yêu cầu các phiên bản PHP khác nhau. Việc này có thể gây ra xung đột hoặc khó khăn nếu bạn chỉ cài đặt một phiên bản PHP duy nhất. Hướng dẫn này sẽ chỉ cho bạn cách quản lý và chuyển đổi linh hoạt giữa các phiên bản PHP khác nhau trên hệ thống Linux, cả cho giao diện dòng lệnh (CLI) và các máy chủ web như Apache hoặc Nginx.
📋 Thời gian: 25 phút | Độ khó: Trung bình
Yêu Cầu
Để thực hiện theo hướng dẫn này, bạn cần:
- Một hệ điều hành Linux (ví dụ: Ubuntu, Debian).
- Quyền truy cập
sudohoặc quyền root. - Kiến thức cơ bản về dòng lệnh Linux.
- Máy chủ web (Apache hoặc Nginx) đã được cài đặt (nếu bạn muốn quản lý PHP cho web server).
Các Bước Thực Hiện
Bước 1: Cài đặt Nhiều Phiên Bản PHP
Trước tiên, chúng ta cần cài đặt các phiên bản PHP mà bạn muốn quản lý. Đối với các bản phân phối dựa trên Debian/Ubuntu, kho lưu trữ PPA của Ondrej Sury là lựa chọn phổ biến và dễ dàng để cài đặt nhiều phiên bản PHP.
# Cập nhật danh sách gói
sudo apt update
# Cài đặt công cụ cần thiết để thêm PPA
sudo apt install software-properties-common -y
# Thêm PPA của Ondrej Sury
sudo add-apt-repository ppa:ondrej/php -y
# Cập nhật lại danh sách gói sau khi thêm PPA
sudo apt update
# Cài đặt các phiên bản PHP mong muốn (ví dụ: PHP 8.1, 8.2, 8.3)
# Bạn có thể cài đặt thêm các extension phổ biến như php-cli, php-mysql, php-fpm
sudo apt install php8.1 php8.1-cli php8.1-mysql php8.1-fpm -y
sudo apt install php8.2 php8.2-cli php8.2-mysql php8.2-fpm -y
sudo apt install php8.3 php8.3-cli php8.3-mysql php8.3-fpm -y
# 💡 Mẹo: Luôn cài đặt `phpX.X-cli` cho CLI và `phpX.X-fpm` cho Nginx hoặc Apache với mod_fcgi/proxy_fcgi.
Bước 2: Quản lý PHP CLI (Command Line Interface)
Sau khi cài đặt nhiều phiên bản PHP, bạn có thể dễ dàng chuyển đổi phiên bản PHP mặc định cho dòng lệnh bằng công cụ update-alternatives.
# Liệt kê tất cả các tùy chọn cho lệnh 'php'
sudo update-alternatives --config php
# Bạn sẽ thấy một danh sách như sau:
# There are 3 choices for the alternative php (providing /usr/bin/php).
#
# Selection Path Priority Status
# ------------------------------------------------------------
# * 0 /usr/bin/php8.3 83 auto mode
# 1 /usr/bin/php8.1 81 manual mode
# 2 /usr/bin/php8.2 82 manual mode
# 3 /usr/bin/php8.3 83 manual mode
#
# Press <enter> to keep the current choice[*], or type selection number:
# Nhập số tương ứng với phiên bản PHP bạn muốn sử dụng làm mặc định (ví dụ: 1 cho PHP 8.1)
# Sau đó nhấn Enter.
# ✅ Xác minh phiên bản PHP hiện tại
php -v
Bước 3: Quản lý PHP cho Web Server (Apache/Nginx)
Việc quản lý PHP cho web server phức tạp hơn một chút vì nó phụ thuộc vào cách bạn đã cấu hình máy chủ của mình.
3.1. Đối với Apache
Apache có thể sử dụng PHP theo hai cách chính: mod_php (ít được khuyến nghị cho nhiều phiên bản) hoặc PHP-FPM (FastCGI Process Manager). Sử dụng PHP-FPM là phương pháp hiện đại và linh hoạt hơn.
Cách 1: Sử dụng mod_php (chỉ nên dùng nếu bạn thực sự cần, không khuyến khích cho nhiều phiên bản)
Nếu bạn đang sử dụng mod_php, bạn cần vô hiệu hóa module PHP cũ và kích hoạt module mới.
# Vô hiệu hóa phiên bản PHP hiện tại (ví dụ: PHP 8.1)
sudo a2dismod php8.1
# Kích hoạt phiên bản PHP mới (ví dụ: PHP 8.3)
sudo a2enmod php8.3
# Khởi động lại Apache để áp dụng thay đổi
sudo systemctl restart apache2
⚠️ Cảnh báo: Phương pháp này chỉ cho phép một phiên bản PHP duy nhất hoạt động cho tất cả các Virtual Host trên Apache. Để chạy nhiều phiên bản PHP cho các Virtual Host khác nhau, bạn nên dùng PHP-FPM.
Cách 2: Sử dụng PHP-FPM (Được khuyến nghị) PHP-FPM cho phép bạn chạy nhiều phiên bản PHP cùng lúc và gán từng phiên bản cho các Virtual Host khác nhau.
# Kích hoạt module proxy_fcgi và cấu hình PHP-FPM cho Apache
sudo a2enmod proxy_fcgi
sudo a2enconf php8.1-fpm # Kích hoạt cấu hình FPM cho PHP 8.1
sudo a2enconf php8.2-fpm # Kích hoạt cấu hình FPM cho PHP 8.2
sudo a2enconf php8.3-fpm # Kích hoạt cấu hình FPM cho PHP 8.3
# Khởi động lại Apache
sudo systemctl restart apache2
# Bây giờ, để một Virtual Host sử dụng PHP 8.2, bạn cần chỉnh sửa file cấu hình Virtual Host đó (ví dụ: /etc/apache2/sites-available/your_site.conf):
# Thêm hoặc chỉnh sửa phần sau trong khối <VirtualHost>:
#
# <FilesMatch \.php$>
# SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"
# </FilesMatch>
#
# 💡 Mẹo: Đảm bảo bạn đã cài đặt `phpX.X-fpm` cho phiên bản PHP bạn muốn sử dụng.
# Sau khi chỉnh sửa Virtual Host, kiểm tra cấu hình Apache và khởi động lại
sudo apache2ctl configtest
sudo systemctl restart apache2
3.2. Đối với Nginx
Nginx luôn sử dụng PHP-FPM để xử lý các yêu cầu PHP. Để thay đổi phiên bản PHP cho một trang web cụ thể, bạn chỉ cần chỉnh sửa file cấu hình của Virtual Host (Server Block) đó.
# Mở file cấu hình Server Block của bạn (ví dụ: /etc/nginx/sites-available/your_site.conf)
sudo nano /etc/nginx/sites-available/your_site.conf
# Tìm dòng `fastcgi_pass` và thay đổi nó để trỏ đến socket của phiên bản PHP-FPM mong muốn.
# Ví dụ, để sử dụng PHP 8.3:
#
# location ~ \.php$ {
# include snippets/fastcgi-php.conf;
# fastcgi_pass unix:/run/php/php8.3-fpm.sock; # Thay đổi số phiên bản tại đây
# }
# Lưu và đóng file.
# Kiểm tra cấu hình Nginx
sudo nginx -t
# Khởi động lại Nginx để áp dụng thay đổi
sudo systemctl restart nginx
Bước 4: Kiểm tra Phiên Bản PHP
Để đảm bảo rằng các thay đổi đã được áp dụng, bạn có thể kiểm tra phiên bản PHP đang hoạt động.
-
Kiểm tra PHP CLI:
php -v✅ Lệnh này sẽ hiển thị phiên bản PHP mà bạn đã chọn bằng
update-alternatives. -
Kiểm tra PHP trên Web Server: Tạo một file
info.phptrong thư mục gốc của trang web của bạn với nội dung sau:<?php
phpinfo();
?>Truy cập file này qua trình duyệt web (ví dụ:
http://your_domain/info.php). Trangphpinfo()sẽ hiển thị chi tiết về phiên bản PHP đang được web server sử dụng cho trang đó. ⚠️ Quan trọng: Sau khi kiểm tra, hãy xóa fileinfo.phpkhỏi máy chủ của bạn vì nó có thể tiết lộ thông tin nhạy cảm.
Troubleshooting
-
PHP CLI vẫn hiển thị phiên bản cũ:
- Đảm bảo bạn đã chạy
sudo update-alternatives --config phpvà chọn đúng phiên bản. - Thử đóng và mở lại terminal.
- Kiểm tra biến môi trường
PATHcủa bạn.
- Đảm bảo bạn đã chạy
-
Web server vẫn sử dụng phiên bản PHP cũ:
- Apache: Đảm bảo bạn đã vô hiệu hóa module PHP cũ (
a2dismod phpX.X), kích hoạt module mới (a2enmod phpY.Y), và khởi động lại Apache (sudo systemctl restart apache2). Nếu dùng PHP-FPM, hãy kiểm tra cấu hình Virtual Host và đảm bảo filephpX.X-fpm.socktồn tại và đúng quyền. - Nginx: Đảm bảo bạn đã chỉnh sửa đúng file cấu hình Server Block và trỏ
fastcgi_passtới socket PHP-FPM chính xác (unix:/run/php/phpY.Y-fpm.sock). Khởi động lại Nginx (sudo systemctl restart nginx). - Xóa cache trình duyệt của bạn hoặc thử truy cập bằng chế đư ẩn danh.
- Apache: Đảm bảo bạn đã vô hiệu hóa module PHP cũ (
-
Lỗi "502 Bad Gateway" (Nginx) hoặc "Internal Server Error" (Apache với FPM):
- Kiểm tra xem dịch vụ PHP-FPM cho phiên bản bạn chọn có đang chạy không:
sudo systemctl status phpY.Y-fpm. Nếu không, hãy khởi động nó:sudo systemctl start phpY.Y-fpm. - Kiểm tra log của Nginx (
/var/log/nginx/error.log) hoặc Apache (/var/log/apache2/error.log) và log của PHP-FPM (/var/log/phpY.Y-fpm.log).
- Kiểm tra xem dịch vụ PHP-FPM cho phiên bản bạn chọn có đang chạy không:
-
Thiếu Extension PHP:
- Mỗi phiên bản PHP cần các extension riêng. Nếu một dự án yêu cầu
curl, bạn phải cài đặtphpX.X-curlcho phiên bản PHP đó. - Ví dụ:
sudo apt install php8.3-curl php8.3-gd.
- Mỗi phiên bản PHP cần các extension riêng. Nếu một dự án yêu cầu
Kết Luận
Việc quản lý nhiều phiên bản PHP trên Linux là một kỹ năng cần thiết cho bất kỳ nhà phát triển web nào làm việc với các môi trường dự án đa dạng. Bằng cách sử dụng update-alternatives cho CLI và cấu hình PHP-FPM cho máy chủ web, bạn có thể dễ dàng chuyển đổi và duy trì các môi trường làm việc khác nhau một cách hiệu quả.
✅ Best Practices:
- Luôn sử dụng PHP-FPM với Apache hoặc Nginx cho hiệu suất và khả năng quản lý tốt hơn, đặc biệt khi chạy nhiều trang web với các phiần bản PHP khác nhau.
- Chỉ cài đặt các extension PHP cần thiết để giữ cho hệ thống sạch sẽ và giảm thiểu rủi ro bảo mật.
- Sau mỗi lần thay đổi cấu hình máy chủ web hoặc PHP, hãy nhớ khởi động lại các dịch vụ tương ứng.
- Thường xuyên kiểm tra các phiên bản PHP đang hoạt động để đảm bảo mọi thứ diễn ra như mong đợi.