Hướng dẫn cài đặt nhiều phiên bản PHP ngoài phiên bản mặc định trên máy tính cài HĐH Linux Debian.
Mỗi phiên bản Linux Debian đi kèm với một phiên bản PHP nhất định, ví dụ Debian 9 (Stretch) là PHP 5.6, Debian 10 (Buster) là 7.4. Để cài đặt được những phiên bản khác, bạn phải sử dụng source repository của Ondřej Surý.
Cài đặt respository của Ondřej Surý
Cài đặt một số công cụ hỗ trợ trong quá trình cài đặt:
sudo apt-get install curl apt-transport-https lsb-release ca-certificates gnupg2
Cài đặt GPG key của source list:
curl https://packages.sury.org/php/apt.gpg | sudo apt-key add -
Tạo file cấu hình repository mới:
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list
Cập nhật repository mới:
apt-get update
Nếu trong quá trình cập nhật repository bạn gặp lỗi sai key như sau:
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https://packages.sury.org/php stretch InRelease: The following signatures were invalid: EXPKEYSIG B188E2B695BD4743 DEB.SURY.ORG Automatic Signing Key <deb@sury.org>
…thì hãy dùng lệnh sau để cập nhật lại key.
sudo apt-key adv --keyserver keys.gnupg.net --recv-keys B188E2B695BD4743
Cài đặt PHP 5.6
Mặc định PHP5 không còn được hỗ trợ trong Debian 9, nhưng với cách cài đặt này thì đây không còn là vấn đề nữa.
Phiên bản mới nhất được hỗ trợ trong Repository này là 5.6.40
. Ta cài đặt phiên bản này và liên kết với Apache2 như sau:
sudo apt-get install php5.6 libapache2-mod-php5.6
Bạn có thể cài đặt thêm các extension cho PHP 5.6 như ví dụ sau:
sudo apt-get install php-pear php5.6-{mysql,curl,gd,intl,imagick,imap,mcrypt,memcache,pspell,recode,snmp,sqlite,tidy,xmlrpc,xsl,mcrypt,mbstring}
Cài đặt PHP 7.x
Repository của Ondřej Surý hỗ trợ nhiều phiên bản PHP 7. Tính đến thời điểm tháng 8/2019 thì phiên bản mới nhất là 7.4 beta
.
Để cài đặt PHP 7.3 – phiên bản ổn định nhất hiện tại, bạn hãy thực hiện các bước cài đặt sau (không khác gì cách cài PHP 5.6, chỉ là thay thế phiên bản).
sudo apt-get install php7.3 libapache2-mod-php7.3
Cài đặt thêm các extension:
sudo apt-get install php-pear php7.3-{mysql,curl,gd,intl,imagick,imap,mcrypt,memcache,pspell,recode,snmp,sqlite,tidy,xmlrpc,xsl,mcrypt,mbstring}
Để cài đặt thêm một phiên bản PHP7 khác, bạn hãy thay thế tương ứng phiên bản 7.3 dưới đây với phiên bản 7.x (7.0, 7.1, …) bạn mong muốn.
Để lựa chọn phiên bản PHP mặc định cho lênh php
thành phiên bản 7.3
, ta cấu hình như sau:
sudo update-alternatives --set php /usr/bin/php7.3 sudo update-alternatives --set phar /usr/bin/phar7.3 sudo update-alternatives --set phar.phar /usr/bin/phar.phar7.3 sudo a2dismod php* sudo a2enmod php7.3 sudo systemctl restart apache2.service
Sử dụng các phiên bản PHP khác nhau cho từng VirtualHost
Giả sử ta đang cài đặt hai phiên bản PHP là 5.6
và 7.3
. Trước tiên ta cài đặt thêm phần mở rộng php-fpm
(FastCGI Process Manager) cho cả hai phiên bản trên.
sudo apt-get install php5.6-fpm php7.3-fpm
Sau khi cài đặt, daemon FPM sẽ tự động khởi chạy. Ta có thể kiểm tra trạng thái chạy bằng những lệnh sau:
sudo systemctl status php5.6-fpm sudo systemctl status php7.3-fpm
Kiểm tra sự tồn tại của FPM UNIX socket của mỗi phiên bản.
ls -l /var/run/php/php5.6-fpm.sock ls -l /var/run/php/php7.3-fpm.sock
Cài đặt mod_fastcgi
cho Apache2 và kích hoạt module FastCGI và một số module cần thiết.
sudo apt-get install apache2 libapache2-mod-fcgid sudo a2enmod actions fcgid alias proxy_fcgi sudo systemctl restart php5.6-fpm php7.3-fpm apache2
Để lựa chọn được phiên bản PHP trong VirtualHost, ta thêm phần xử lý file PHP như sau trong các file cấu hình VirtualHost của Apache2.
<VirtualHost *:80> ... <FilesMatch \.php$> # Apache 2.4.10+ can proxy to unix socket SetHandler "proxy:unix:/var/run/php/php7.3-fpm.sock|fcgi://localhost/" </FilesMatch> ... </VirtualHost>
Hãy chú ý đoạn /var/run/php/php7.3-fpm.sock
là đường dẫn đến FPM Unix socket của phiên bản PHP được sử dụng cho VirtualHost (ở đây là PHP 7.3). Hãy thay 7.3 bằng phiên bản PHP bạn muốn.
Ví dụ một file cấu hình VirtualHost cho domain example.com
sử dụng PHP 5.6 như sau:
<VirtualHost *:80> ServerName example.com ServerAdmin admin@example.com DocumentRoot /var/www/example <Directory /var/www/example> Options -Indexes +FollowSymLinks +MultiViews AllowOverride All Require all granted </Directory> <FilesMatch \.php$> # Apache 2.4.10+ can proxy to unix socket SetHandler "proxy:unix:/var/run/php/php5.6-fpm.sock|fcgi://localhost/" </FilesMatch> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>