Setting up different PHP versions in Ubuntu on Apache2
Tags: php, ubuntu, xdebug, apache
Published: 2022-02-18 14:05:28

This is a machine translation of the article "[Configuring different versions of PHP in Ubuntu on Apache2](http://maximepihin.ru/all/nastraivaem-raznye-versii-php-v-ubuntu-na-apache2/)" from my [personal blog](http://maximepihin.ru/).
 
In this article, I will tell you my experience of setting up PHP of different versions on the same machine running Ubuntu Linux in conjunction with Apache2, xdebug and PHPStorm. It's not new, but I've had problems that PHPStorm didn't catch Debug on different versions, but preferred one.

## Installing prerequisites

First you need to completely remove the existing PHP, and then install the required versions (we will install PHP 7.0 and 7.4) from the **ppa:ondrej/php repository**:

```
sudo apt purge 'php*'
sudo apt-get install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update -y

# for version 7.0

sudo apt-get install php7.0 php7.0-fpm  libapache2-mod-php7.0 php7.0-mbstring php7.0-pgsql php7.0-xdebug libapache2-mod-fcgid -y

# for version 7.4

sudo apt-get install php7.4 php7.4-fpm  libapache2-mod-php7.4 php7.4-mbstring php7.4-pgsql php7.4-xdebug libapache2-mod-fcgid -y
```
Here we have installed the following packages:

- **php7.X** is a metapackage used to run PHP applications.
- **php7.X-fpm** provides a Fast Process Manager interpreter that runs as a daemon and accepts Fast/CGI requests.
- **libapahce2-mod-php7.X** provides a PHP module for the Apache web server.
- **libapache2-mod-fcgid** contains mod_fcgid, which runs multiple instances of the CGI program to handle concurrent requests.
- **php7.X-mbstring** module for working with multibyte strings
- **php7.X-pgsql** links PHP to PostgreSQL database
- **php7.X-xdebug** module for debugging

## Setting up xdebug debugging

Now we need to configure **xdebug** itself in the system and PHPStorm. To do this, go along the path _/etc/php/7.X/fpm/_ and add the section to **php.ini**:

```
# for version xdebug < 3

[xdebug] 
zend_extension=xdebug.so
xdebug.default_enable=1
xdebug.client_port=9000
xdebug.remote_autostart=1
xdebug.remote_enable=1 
xdebug.remote_host=127.0.0.1 
xdebug.remote_handler="dbgp"
xdebug.remote_port=9000

# for version xdebug >= 3

[xdebug] 
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.client_host=127.0.0.1
xdebug.client_port=9003
xdebug.start_with_request=yes
```

In **PHPStorm** itself, the settings are made in _Settings -> PHP_:
- Select the desired version and CLI interpreter
- In the **Debug** section, uncheck _Ignore external connections through unregistered server configurations_ and _Break at first line in PHP scripts_
- Set **Debug port** to 9000 for xdebug version < 3 and 9003 for xdebug version >= 3.

You may need to add your local site address to the Servers tab, but this may not be necessary. Just in case, I will specify the setting:
- In **Name** we write any name
- In **Host** we write the address without a protocol to your site, for example, mysite.local

![PHPStorm PHP Debug settings](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/brjtck7mlsnvx9o6kd5b.png)

## Setting up virtual hosts in Apache2

You need to create a virtual host configuration file:

```
<VirtualHost *:80>     
  ServerName domain.local
  ServerAlias www.domain.local
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/directory
  
  <Directory /var/www/directory>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
  </Directory>

  <FilesMatch \.php$>
    # For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
    SetHandler "proxy:unix:/run/php/php7.X-fpm.sock|fcgi://localhost"
  </FilesMatch>

  ErrorLog ${APACHE_LOG_DIR}/domain-error.log
  CustomLog ${APACHE_LOG_DIR}/domain-access.log combined
</VirtualHost>
```

Pay attention to the line `SetHandler "proxy:unix:/run/php/php7.X-fpm.sock|fcgi://localhost"`. You need to replace **X** with the PHP version. In our case, 0 or 4.

How to create and activate sites, I think you know. If not, there are plenty of guides on the internet on this subject.


## Reloading services

At the final stage, you need to overload the services and enable the necessary modules:

```
sudo systemctl start php7.0-fpm
sudo systemctl start php7.4-fpm
sudo a2enmod actions fcgid alias proxy_fcgi
```

That's it, now you have 2 versions of PHP on different local sites and xdebug will work on both sites.