Installing PHP on Ubuntu Linux
May 20, 2019 by Areg Sarkissian
In this post I will detail the steps to install PHP onto an Ubuntu 18.04 (bionic) OS.
The instructions here can be applied in general to other Linux distributions.
You can install and use the Ubuntu distribution on Windows 10 using the Windows Subsystem for Linux (WSL) with platform specific changes.
Instructions for enabling WSL and installing a Linux distribution can be found at
Note the upcoming WSL2 will provide native Linux support on the Windows 10 platform.
Testing the install with Docker
If you have Docker installed on your machine you can bring up an Ubuntu container (or any other Linux container) running bash in interactive mode to test the installation before installing on your local machine.
Here is the command to run bash in the Ubuntu 18.04 container:
docker run -ti --rm ubuntu:bionic bash
The first time you run this command, it will take a little bit of time to download the docker image. Subsequent runs will be very quick.
Note: Any of the changes below that you make to the running container will be lost if you exit the container.
Installing PHP using the APT package manager
Before installing the PHP files we should update the Ubuntu
apt package manager after which we can add the package repository from where the PHP installation package will be retrieved.
These steps are listed below:
#update the apt package manager apt-get update #install the package that allows us to add the PHP repository apt-get install software-properties-common -y --no-install-recommends #add the PHP package repostory add-apt-repository ppa:ondrej/php -y
Now we are setup to install PHP.
Run the following bash commands to install the PHP CLI and the PHP-FPM service along with some PHP extensions
apt-get install -y --no-install-recommends \ php7.3 \ php7.3-fpm \ php7.3-mbstring \ php7.3-bcmath \ php7.3-xml \ php7.3-xmlrpc \ php7.3-zip \ php7.3-sqlite3 \ php7.3-mysql \ php7.3-pgsql \ php7.3-imap \ php7.3-readline \ php7.3-phpdbg \ php7.3-curl \ php7.3-dev \ php-pear \ php-ssh2 \ php-yaml \ php-memcached \ php-redis \ php-apcu \ php-xdebug \ php-xhprof \ curl \ unzip
Note: installing the php7.3 package will also install php7.3-cli, php7.3-common, php7.3-json, php7.3-opcache and other PHP extensions that we did not explicitly specify above.
Next run the following commands to clean up temporary files generated by the installation
apt-get autoremove -y && apt-get clean -y rm -rf /tmp/* /var/tmp/* /usr/share/doc/*
Finally run the following to fix a PHP v7.3 JIT Compiler error when running the PHP Composer package manager:
sed -i 's/;pcre.jit=1/pcre.jit=0/g' /etc/php/7.3/cli/php.ini sed -i 's/;pcre.jit=1/pcre.jit=0/g' /etc/php/7.3/fpm/php.ini
The above statements uncomment and set the value of the
pcre.jit setting in the php.ini configuration files.
You can run the following commands before and after uncommenting the JIT setting to verify the settings are updated in their respective php.ini files.
cat /etc/php/7.3/cli/php.ini | grep ';pcre.jit=1' cat /etc/php/7.3/fpm/php.ini | grep ';pcre.jit=1'
You can run the following commands to verify the installation:
php -vto see the version of installed PHP.
php -mto see all installed PHP extensions.
php -ito get all the information regarding the PHP installation
php-fpm7.3 -vto see the version of installed PHP-FPM.
The PHP installation directories
If we look in
/usr/bin/ we will see the following symlink:
php -> /etc/alternatives/php
and if look in
/etc/alternatives/ we will see the following symlink:
php -> /usr/bin/php7.3
Which shows that we are pointing to PHP v7.3.
You can run
which php to see that the php command is located at
This means that we must make sure we have the
/usr/bin directory in our PATH environment variable.
Similarly if we run
which php-fpm7.3 we will see it is found at
/usr/sbin/php-fpm7.3 so we need to ensure
/usr/sbin/ is in our PATH as well.
We can check that by executing:
PHP and PHP FPM configuration files
The PHP CLI and PHP-FPM configuration files will be installed at the following locations:
PHP extension configuration files
Each PHP extension that we install will have its own configuration
<extension-name>.ini file installed in
Here are a few examples:
/etc/php/7.3/mods-available/opcache.ini /etc/php/7.3/mods-available/xdebug.ini /etc/php/7.3/mods-available/pdo_mysql.ini
/etc/php/7.3/fpm/conf.d/ directories will have symlinks to the
If we take a look in
/etc/php/7.3/cli/conf.d/ we will see for example the following two symlinks among many others.
10-opcache.ini -> /etc/php/7.3/mods-available/opcache.ini 20-xdebug.ini -> /etc/php/7.3/mods-available/xdebug.ini
The same symlinks will exist if we look in
Optionally we can configure xdebug for remote debugging and configure opcode caching:
'xdebug.remote_enable=1' >> /etc/php/7.0/mods-available/xdebug.ini
'extension=apcu.so' >> /etc/php/7.3/mods-available/cache.ini
We can enable the xdebug extension using the following command:
Note: This section does not apply to the Ubuntu docker container used for testing the setup. This is because we can not run the PHP-FPM service using the
systemctlcommand from within the docker container. The docker container only runs a single process and is not configured to run the
We can check if our PHP-FPM configuration is correct before running the service:
We can start or restart the service by running:
systemctl restart php7.3-fpm
We can check the status of the service by running:
systemctl status php7.3-fpm
In this post I detailed the steps to take to install PHP on Ubuntu Linux. I also described the installation of PHP extensions and the PHP-FPM FastCGI process manager for PHP.
The following resources were used as a reference:
Thanks for reading.