Sử dụng nhiều phiên bản PHP trên Apache

Như các bạn biết, việc cài đặt server apache thì trong cùng 1 server chỉ sử dụng được 1 phiên bản của PHP. Nếu như bạn dùng PHP5 thì sẽ không chạy được PHP 7 hoặc ngược lại.

Việc trên gây ra khá nhiều bất tiện trong quá trình phát triển phần mềm, nhất là với việc chuyển đổi (migrate) từ một hệ thống cũ (chạy PHP 5) lên hệ thống mới với phiên bản PHP cao hơn (PHP 7). Nó gây ra cho bạn khá nhiều bất tiện, mỗi khi bạn muốn chuyển đổi về hệ thống cũ để kiểm tra chức năng (function) với hệ thống mới bạn sẽ phải cài đặt lại module PHP cho Apache. Rất rất mất thời gian cho quá trình đó.

Do vậy nay tôi sẽ hướng dẫn bạn cài đặt một server Apache có thể chạy đồng thời nhiều phiên bản PHP khác nhau(PHP 5.4, 5.5, PHP 7....).

Môi trường tôi sử dụng là Mac OS X, Apache 2.4, PHP (5.3, 5.4, 7.0). Với môi trường Linux thì cũng có thể cài đặt tương tự như trên Mac OS X.

Để cho tiện cho việc cài đặt các module, tôi sử dụng HomeBrew (dành riêng cho Mac OS X, trên Ubuntu hoặc các phiên bản khác đã có sẵn package manager như apt-get, yum ...)

1. Cách cài đặt HomeBrew (với linux thì bạn bỏ qua bước này)

Bạn có thể tải cài đặt HomeBrew tại http://brew.sh

Với MacOS thì bạn cần phải cài XCodeCommand Line Tools. Sau khi cài đặt XCode bạn cần phải mở XCode và chấp nhận Terms and Conditions sau đó cài đặt Command Line Tools bằng câu lệnh:

xcode-select --install

Để cài HomeBrew, bật Terminal và sử dụng câu lệnh:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Sau khi câu lệnh được thực thi bạn đã cài đặt thành công HomeBrew

2. Cài đặt Apache

Trên Mac OS X thì Apache đã được cài sẵn. Việc của chúng ta là bật lên và sử dụng 😄

Khởi động Apache trong Mac OS X bằng cách sử dụng câu lệnh:

$ sudo apachectl start

Nếu bạn muốn dừng Apache thì sử dụng lệnh:

$ sudo apachectl stop

Để restart Apache thì sử dụng lệnh

$ sudo apachectl -k restart

Còn với các bạn sử dụng Linux thì tham khảo cách cài đặt Apache tại: https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu

hoặc sử dụng câu lệnh cho Ubuntu như:

sudo apt-get update
sudo apt-get install apache2

2.1 Cấu hình Apache

Để có thể sử dụng multi-version PHP thì bạn cần bật một số extension cho Apache như:

  • mod_rewrite
  • mod_alias
  • mod_vhost_alias
  • mod_fcgid (Hướng dẫn cài đặt ở phần sau)

Để bật các extension cho Apache bạn làm theo cách sau:

  • Mở và sửa file /etc/apache2/httpd.conf với quyền sudo.
  • Tìm đến module cần bật ví dụ
...
#LoadModule rewrite_module libexec/apache2/mod_rewrite.so
...
  • Xóa # để kích hoạt extension
  • Khởi động lại Apache

Với module vhost bạn có thể tham khảo thêm tại:

https://coolestguidesontheplanet.com/how-to-set-up-virtual-hosts-in-apache-on-mac-osx-10-11-el-capitan/

3. Cài đặt PHP

Để có thể sử dụng nhiều phiên bản PHP trên cùng 1 server Apache đồng nghĩa với việc bạn phải cài nhiều phiên bản PHP. Để cài php trên MacOSX khá dễ dàng với HomeBrew (Trên Linux Ubuntu cũng rất dễ với apt-get )

Cách cài như sau:

  • Bật Terminal
  • Sử dụng lệnh sau để cài PHP:
$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/homebrew-php
$ brew install php54
$ brew unlink php54
$ brew install php55
$ brew unlink php55
$ brew install php56
$ brew unlink php56
$ brew install php70

Sau khi dùng các lệnh trên bạn đã có trong tay PHP 5.4, 5.4, 5.6, 7.0.

Và bạn cũng sẽ có các file cấu hình php.ini tương ứng cho từng version PHP tại:

/usr/local/etc/php/5.4/php.ini
/usr/local/etc/php/5.5/php.ini
/usr/local/etc/php/5.6/php.ini
/usr/local/etc/php/7.0/php.ini

Và bạn cũng sẽ có các folder chứa PHP tương ứng như sau:

/usr/local/Cellar/php54/...
/usr/local/Cellar/php55/...
/usr/local/Cellar/php56/...
/usr/local/Cellar/php70/...

Với Linux cách cài đặt và đường dẫn sẽ khác 1 chút.

4. Cài đặt Apache để chạy đa phiên bản PHP

4.1 Cài đặt mod_fcgid

Bạn cài đặt bằng cách sử dụng lệnh sau:

$ brew install mod_fcgid

Sau khi cài đặt thành công bạn sẽ có mod_fcgid tại thư mục /usr/local/Cellar/mod_fcgid

4.2 Kích hoạt mod_fcgid trong Apache

Để kích hoạt mod_fcgid bạn làm theo các bước sau:

  • Mở file /etc/apache2/httpd.conf
  • Thêm các dòng sau vào cuối file:
LoadModule fcgid_module /usr/local/Cellar/mod_fcgid/2.3.9/libexec/mod_fcgid.so

<IfModule fcgid_module>
    AddHandler  fcgid-script .fcgi .fpl
    FcgidConnectTimeout 20
    FcgidMaxRequestLen 268435456
    FcgidMaxProcessesPerClass 10
    FcgidIOTimeout 300
</IfModule>
  • Khởi động lại Apache

4.3 Tạo PHP Launcher với code fcgi

4.3.1 Tạo folder chứa PHP Laucher

Mình sẽ tạo 1 folder cgi-bin để chứa launcher Bật Terminal gõ lệnh:

$ mkdir /usr/local/bin/cgi-bin

4.3.2 Set owner và phân quyền (permission) cho folder cgi-bin

$ sudo sudo chown -R _www:_www /usr/local/bin/cgi-bin
$ sudo chmod -R 775 /usr/local/bin/cgi-bin

4.3.3 Tạo script laucher

Để chạy được nhiều phiên bản PHP khác nhau, bạn cần phải tạo các script cho từng phiên bản php khác nhau.

Ví dụ tạo laucher cho php 5.4 bằng cách:

  • Tạo file php54.fcgi tại /usr/local/bin/cgi-bin
  • Nhập nội dung:
#!/bin/bash
exec /usr/local/Cellar/php54/5.4.xxxx/bin/php-cgi
  • Phân quyền cho file bằng lệnh
$ sudo sudo chown _www:_www /usr/local/bin/cgi-bin/php54.fcgi
$ sudo chmod 775 /usr/local/bin/cgi-bin/php54.fcgi

Làm tương tự cho các version khác bằng cách thay đổi nội dung script bằng đường dẫn đến folder chứa PHP tương ứng

Khi đó ta sẽ có các script laucher như sau:

/usr/local/bin/cgi-bin/php54.fcgi
/usr/local/bin/cgi-bin/php55.fcgi
/usr/local/bin/cgi-bin/php56.fcgi
/usr/local/bin/cgi-bin/php70.fcgi

4.4 Cài đặt vhost cho Apache

Bạn có thể tham khảo cách cài vhost thêm tại https://coolestguidesontheplanet.com/how-to-set-up-virtual-hosts-in-apache-on-mac-osx-10-11-el-capitan/

Dưới đây tôi chỉ hướng dẫn bạn cách cài đặt vhost kèm với phiên bản PHP cho từng dự án:

  • Ví dụ về 1 file config cho project như sau:
<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot "/Users/tpro/Framgia/testphp54"
    ServerName testphp54
    CustomLog "/private/var/log/apache2/testphp54-access_log" common
    ErrorLog "/private/var/log/apache2/testphp54-error_log"

    <Directory "/Users/tpro/Framgia/testphp54">
        Options Indexes FollowSymLinks Multiviews
        MultiviewsMatch Any
        AllowOverride All
        Require all granted
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
  • Config cho việc gọi launcher PHP bằng cách thêm dòng FcgidWrapper /usr/local/bin/cgi-bin/php54.fcgi .phpSetHandler cho các file php bằng cách thêm đoạn sau:
<FilesMatch \.php$>
    SetHandler fcgid-script
</FilesMatch>
  • Và bật thực thi ExecCGI vào Options trong Directory

Kết quả bạn nhận được như sau:

<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot "/Users/tpro/Framgia/testphp54"
    ServerName testphp54
    CustomLog "/private/var/log/apache2/testphp54-access_log" common
    ErrorLog "/private/var/log/apache2/testphp54-error_log"

    FcgidWrapper /usr/local/bin/cgi-bin/php53.fcgi .php
    <Directory "/Users/tpro/Framgia/testphp54">
        <FilesMatch \.php$>
            SetHandler fcgid-script
        </FilesMatch>

        Options Indexes FollowSymLinks Multiviews ExecCGI
        MultiviewsMatch Any
        AllowOverride All
        Require all granted
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

Vậy là hoàn thành việc cài đặt php theo từng project (vhost) Để thay đổi phiên bản khác bạn chỉ cần đổi tên laucher /usr/local/bin/cgi-bin/php53.fcgi thành /usr/local/bin/cgi-bin/php70.fcgi

Để hệ thống tự nhận file index.php bạn cần phải thêm index.php vào sau DirectoryIndex index.html trong file httpd.conf của Apache như sau:

...
<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>
...

Sau khi thực hiện các bước trên bạn đã có 1 server Apache chạy đa phiên bản PHP.

Thanks for reading!