Multiple PHP version has come nowadays, so if you want to deploy your current project that is made upon PHP 7.4 and your server PHP version is PHP 5.6 and your older projects are also running on that server and you don’t want to hamper your running projects as well you want to host the recent application that is made for PHP 7.4, so how will you do it.
The answer is simple we will need to run multiple instances of PHP by assigning them a different port number.
I am using centos 7 and Apache2 for this article.
How does It work?
when the PHP file is run on apache serve then Apache will call “SetHandler application/x-httpd-php” which will decide which installed module needs to call to run a PHP script. which can be defined under the apache configuration file (httpd.conf) generally can found under “etc/httpd/conf/ “ directory.
This is the standard method to call PHP file when you have only one PHP installed on the server but when you try to run multiple versions of PHP on the same server then we need some magical module called “PHP-FPM”
What is PHP-FPM
FPM is an alternative to normal PHP FastCGI with some additional features. to know more about PHP-FPM you can check php official website
Follow the Given step to install multiple versions of PHP. I am installing PHP 5.6 (the oldest Php version that which can be installed easily in centos 7 you might install php5.3 but I have not tested it yet for php5.3) and another version is the latest PHP 7.4.
Step 1: Install required packages
Run given Command to install each package.
Apache
yum install httpd
Extra Packages for Enterprise Linux(EPEL)
yum install epel-release
Yum utilities
yum install yum-utils
Finally, Update yum
yum update
Step 2: Install PHP multiple versions
First of all we need to install Remi-repository from where we will install php-fpm
Remi-repository
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
PHP5.6 and PHP-FPM5.6
yum install php56
yum install php56-php-fpm
PHP7.4 and PHP-FPM7.4
yum install php74
yum install php74-php-fpm
Step 3: Stop both PHP-FPM
Stop php-fpm by pasting the following command on the terminal.
systemctl stop php56-php-fpm
systemctl stop php74-php-fpm
Step 4: Configure PHP-FPM
By default, apache will listen to port 9000 for php.when we have multiple versions of php we need to define a unique port to listen to each php version. you can manually change the port number by opening the www.conf file.
php 5.6
For manually change open /etc/opt/remi/php56/php-fpm.d/www.conf and replace the 9000 with 9056(whatever port you want). If you want to change from the command copy and paste the given line in your terminal.
sed -i 's/:9000/:9056/' /etc/opt/remi/php56/php-fpm.d/www.conf
php 7.4
For manual open /etc/opt/remi/php74/php-fpm.d/www.conf and replace the 9000 with 9074 (whatever port you want). If you want to change from the command copy and paste the given line in your terminal.
sed -i 's/:9000/:9074/' /etc/opt/remi/php74/php-fpm.d/www.conf
Running two php-fpms
Copy and paste the given command on terminal
systemctl start php74-php-fpm
systemctl start php56-php-fpm
Step 5: Configure SELinux
Run two php-fpms
Copy and paste the given command on terminal
systemctl start php74-php-fpm
systemctl start php56-php-fpm
Step 5: Configure SELinux
When you want to use a new port then you need to add it to SELINUX. To add the newly used port on SELINUX run the following command.
semanage port -a -t http_port_t -p tcp 9074
semanage port -a -t http_port_t -p tcp 9056
Step 6: Make Script Wrapper
We need to make a script wrapper to call both versions of php on the basis of users request to create a script wrapper run following command
php5.6
cat > /var/www/cgi-bin/php56.fcgi << EOF
#!/bin/bash
exec /bin/php56-cgi
EOF
php7.4
cat > /var/www/cgi-bin/php74.fcgi << EOF
#!/bin/bash
exec /bin/php74-cgi
EOF
Make script wrapper exicutable
sudo chmod 755 /var/www/cgi-bin/php56.fcgi
sudo chmod 755 /var/www/cgi-bin/php74.fcgi
Step 7: Configure Apache
Open the file httpd.conf and configure your file with desired directory root for php5.6 and php7.4 I am going to display my configuration here.
php5.6
<VirtualHost *:80>
ServerAdmin admin@vexplains.com
ServerName vexplains.com
DocumentRoot /var/www/html/56
DirectoryIndex index.php index.html
<FilesMatch "\.php$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://127.0.0.1:9056"
</If>
</FilesMatch>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
AddHandler php56-fcgi .php
Action php56-fcgi /cgi-bin/php56.fcgi
<Directory "/var/www/html/56">
AllowOverride All
</Directory>
</VirtualHost>
ph.7.4
<VirtualHost *:80>
ServerAdmin admin@vexplains.com
ServerName vexplains.com
DocumentRoot "/var/www/html/php74"
DirectoryIndex index.html index.php
<Directory "/var/www/html/php74">
AllowOverride All
</Directory>
<FilesMatch "\.php$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://127.0.0.1:9074"
</If>
</FilesMatch>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
AddHandler php74-fcgi .php
Action php74-fcgi /cgi-bin/php74.fcgi
</VirtualHost>
Step 8: Start/Enable Services
systemctl enable httpd
systemctl enable php56-php-fpm
systemctl enable php74-php-fpm
systemctl start httpd
systemctl start php56-php-fpm
systemctl start php74-php-fpm
Additional Information
when you want to install some package for php then you need to install as below.
for example, if you want to install php-mbstring then you need to install as below
php5.6
yum install php56-php-mbstring
php7.4
yum install php74-php-mbstring
after successfull installtion you need to restart php-fpm
systemctl stop php56-php-fpm
systemctl stop php74-php-fpm
Other than new module installation, if you made any change on php.ini file then you also need to restart PHP-FPM
If you have any problem then mail me @ kumarvedant777@gmail.com