Switching PHP versions on Debian with Apache2

How to set PHP version on Debian between multiple versions

If several PHP versions are installed on a Debian 10 and Debian 11 or Ubuntu 22.10, a PHP version can be set and activated for the system default and the Apache 2 HTTP web server.

Let’s assume that several PHP versions are installed on the Debian system. Now the active PHP version for CLI and Apache 2 web server should be changed. This tutorial shows how to switch between multiple PHP versions for Apache web server and CLI.

Enable a PHP version as default

PHP 8.2 should be set as the active PHP version for CLI and Apache 2 HTTP web server. This is done by disabling the Apache 2 modules for all other installed PHP versions and setting them from the CLI with the update-alternatives command.

$ update-alternatives --set php /usr/bin/php8.2
$ update-alternatives --set phar /usr/bin/phar8.2
$ update-alternatives --set phar.phar /usr/bin/phar.phar8.2

  Phar is a PHP extension that makes it possible to process programs or files packaged in PHAR format (PHP archive) from a compressed archive file. The archives created with the Phar PHP class are created in bzip2 and gzip compression.

For the Apache 2 web server, the corresponding module is activated with the Apache helper, by using the a2enmod command, use a2dismod to disable a module.

$ a2dismod php7.4
$ a2enmod php8.2
$ systemctl restart apache2

a2enmod is a script that enables the specified module within the apache 2 configuration. It does this by creating symlinks within /etc/apache2/mods-enabled. Likewise, a2dismod disables a module by removing those symlinks. It is not an error to enable a module which is already enabled, or to disable one which is already disabled.

Multiple PHP mudules can be disabled in one single command.

$ a2dismod php5.6 php7.1 php7.3 php7.4 php8.0 php8.1

The Apache HTTP server control interface can be used to output all PHP modules available on the system.

$ apache2ctl -M

For Red Hat or Rocky Linux and AlmaLinux (CentOS), the command is.

$ apachectl -M
Loaded Modules:
 core_module (static)
 mime_module (shared)
 php_module (shared)

Show all PHP modules installed on the system, here in abbreviated form.

a2query is a program for retrieving configuration values of Apache 2 HTTP web server, it returning feasible values even if the Apache 2 syntax validator fails.

$ a2query -m | grep php
php8.2 (enabled by site administrator)

You can also use find to call up and display the available Apache 2 PHP modules on the file system.

$ find /etc/apache2/mods-available/ -name *php*

The system-wide PHP settings can be found under /etc/php, for changes open the php.ini file in the editor of your choice.

$ vi /etc/php/8.2/apache2/php.ini

  Replace the appropriate version number in the directory path.

Check active PHP version

Which PHP version is active? can be obtained from CLI querying the PHP version set active on the system as follows.

$ php -v
PHP 8.2.3 (cli) (built: Feb 14 2023 16:53:07) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.3, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.3, Copyright (c), by Zend Technologies

The current PHP version and modules for the Apache 2 web server are displayed by creating a php file with the following content.


The Apache 2 default-site has the DocumentRoot in /var/www/html, create the phpinfo.php file here, unless another DocumentRoot is chosen.

The current PHP version and modules for the Apache web server are displayed in the web browser. http://ip_or_fqdn/phpinfo.php

for example:

phpinfo query php version with browser

  On a production system, phpinfo.php should be removed from the DocumentRoot after the check is complete.

phpMyAdmin with PHP8 installation on Debian 11

How to deploy phpMyAdmin with PHP 8.2 on Debian 11 (bullseye)

This tutorial shows how to install phpMyAdmin web application on Debian 11 Bullseye with Apache2 for administration and management of MySQL and MariaDB databases from web browsers.

  On Debian 11, the easiest way to install phpMyAdmin is via the Package Manager, withapt install phpmyadminbut this is no longer up-to-date since php 8 is provided.

Since Debian 11 installs from the default repository, phpMyAdmin is provided for PHP 7.4, but if requires a newer PHP version, for example for a current CMS such as WordPress, where PHP 8 or newer is recommended, phpMyAdmin can be installed manually in just a few steps.


The installation is done here as root by using “su -“, for the packages Apache2, MariaDB and PHP 8.2 provided by DEB.SURY.ORG.

First of all, required service packages are installed.

$ apt install lsb-release apt-transport-https ca-certificates wget gnupg -y

Add the Sury Repository for PHP 8 on the system.

$ wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
$ echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php.list

Update the package lists as follows.

$ apt update

If the Apache2 web server is not already installed.

$ apt install apache2 -y

Now install PHP 8.2 with the most important PHP modules.

$ apt install php8.2 php8.2-common php8.2-cli php8.2-curl php8.2-imap php8.2-apcu php8.2-intl php8.2-cgi php8.2-mbstring php8.2-gd php8.2-mysql php8.2-opcache php8.2-bcmath php8.2-xml php8.2-xsl php8.2-zip php8.2-bz2 libapache2-mod-php8.2 -y

Update the packages as follows.

$ apt update && apt upgrade -y
$ [ -f /var/run/reboot-required ] && reboot -f

The next step is to install the MariaDB server and (MySQL) client.

$ apt install mariadb-server mariadb-client -y

Then complete the configuration of the MariaDB server.

$ mysql_secure_installation

Since the root password for the database is not yet set, press Enter to skip the initial query. Complete the following queries:

  • Switch to unix_socket authentication [Y/n] – Enter n to skip.
  • Set root password? [Y/n] – Type y and press Enter to create a root password for your database. If you already have a root password, enter n to not change the root password.
  • Remove anonymous users? [Y/n] – Type y and press Enter.
  • Disallow root login remotely? [Y/n] – Type y and press Enter.
  • Remove test database and access to it? [Y/n] – Type y and confirm with Enter.
  • Reload privilege tables now? [Y/n] – Type y and confirm with Enter.

MariaDB is now operational. Just change the directory path.

$ cd /usr/share

To download phpMyAdmin run the command as follows.

$ wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip -O phpmyadmin.zip

Unzip the archive you just downloaded as follows.

$ unzip phpmyadmin.zip

After unzipping, remove the downloaded archive.

$ rm -f phpmyadmin.zip

Then rename the unzipped directory.

$ mv phpMyAdmin-*-all-languages phpmyadmin

And change the permissions to the phpMyAdmin directory.

$ chmod -R 0755 phpmyadmin

Now create an Apache2 configuration file for phpMyAdmin /etc/apache2/conf-available/phpmyadmin.conf.

Paste the following content into the terminal shell.

$ cat << EOF > /etc/apache2/conf-available/phpmyadmin.conf
Alias /phpmyadmin /usr/share/phpmyadmin

<Directory /usr/share/phpmyadmin>
    Options SymLinksIfOwnerMatch
    DirectoryIndex index.php

<Directory /usr/share/phpmyadmin/templates>
    Require all denied
<Directory /usr/share/phpmyadmin/libraries>
    Require all denied
<Directory /usr/share/phpmyadmin/setup/lib>
    Require all denied

Check the new Apache2 configuration you just modified.

$ apachectl -t
Syntax OK

Enable the Apache2 configuration file you just created.

$ a2enconf phpmyadmin

And reload the Apache2 web server.

$ systemctl reload apache2

Create the temporary directory that phpMyAdmin needs.

$ mkdir /usr/share/phpmyadmin/tmp/

Now grant the web server user the required owner rights.

$ chown -R www-data:www-data /usr/share/phpmyadmin/tmp/

  Up to and including Debian 10 and Ubuntu, password authentication to the MariaDB server is not possible by default for root login (e.g. via phpMyAdmin) for security reasons. On Debian 11, however, this is possible. For Debian 10, the following steps can be performed to allow root login using a password as well.

$ mysql -u root
UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE user = 'root' AND plugin = 'unix_socket';

The Apache2 web server with PHP 8, the MariaDB server and phpMyAdmin is now ready to use.

The phpMyAdmin website can be reached by adding /phpmyadmin to the IP address or FQDN in the browser URL.
for example:

Welcome to phpMyAdmin

View and change PHP version

If several PHP versions are installed on the system, an installed PHP version can be activated for the Apache2 web server.

The corresponding module is activated with the Apache helper, with the command a2enmod, and deactivated with a2dismod.

$ a2dismod php7.4
$ a2enmod php8.2
$ systemctl restart apache2

The current PHP version and modules are displayed by creating a php file with the following content. If no other Apache2 site is available, this can be saved as phpinfo.php in the docroot at /usr/share/phpmyadmin.


The PHP settings for the Apache2 web server are displayed in tabular form in the web browser. i.e.

phpinfo in Webbrowser öffnen

  For productive systems, phpinfo should be removed again.