Install PHP on Linux

Install PHP on Linux

Installing PHP on Linux varies by distribution, but the process is generally straightforward. This guide covers the most popular Linux distributions and installation methods.

Ubuntu/Debian Systems

Method 1: Using APT Repository (Recommended)

Ubuntu and Debian include PHP in their official repositories.

Step 1: Update Package Lists

sudo apt update
sudo apt upgrade

Step 2: Install PHP

# Install latest PHP version
sudo apt install php

# Or install specific version
sudo apt install php8.2

# Install commonly used extensions
sudo apt install php-cli php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip

Step 3: Verify Installation

php --version

Method 2: Using Ondrej’s PPA (Multiple Versions)

For access to multiple PHP versions:

# Add Ondrej's PPA
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update

# Install multiple versions
sudo apt install php8.2 php8.1 php8.0

# Switch between versions
sudo update-alternatives --set php /usr/bin/php8.2

CentOS/RHEL/Fedora Systems

Method 1: Using YUM/DNF

Step 1: Enable EPEL Repository (CentOS/RHEL)

# CentOS/RHEL 8/9
sudo dnf install epel-release

# CentOS 7
sudo yum install epel-release

Step 2: Install PHP

# CentOS/RHEL 9
sudo dnf module enable php:8.2
sudo dnf install php php-cli php-fpm php-mysqlnd php-gd php-mbstring

# CentOS/RHEL 8
sudo dnf module enable php:remi-8.2
sudo dnf install php php-cli php-fpm php-mysqlnd php-gd

# CentOS 7
sudo yum install php php-cli php-fpm php-mysql php-gd php-mbstring

Method 2: Using Remi Repository (Multiple Versions)

# Install Remi repository
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm

# Install PHP versions
sudo dnf module reset php
sudo dnf module enable php:remi-8.2
sudo dnf install php php-cli php-fpm php-mysqlnd

Arch Linux

Method 1: Using Pacman

# Update system
sudo pacman -Syu

# Install PHP
sudo pacman -S php php-apache php-fpm

# Install extensions
sudo pacman -S php-gd php-intl php-mysql

Method 2: Using AUR for Specific Versions

# Install yay AUR helper
sudo pacman -S yay

# Install specific PHP version
yay -S php82

Install Apache with PHP Module

Ubuntu/Debian

# Install Apache with PHP
sudo apt install apache2 libapache2-mod-php

# Enable PHP module
sudo a2enmod php8.2

# Restart Apache
sudo systemctl restart apache2

CentOS/RHEL

# Install Apache
sudo dnf install httpd

# Install Apache PHP module
sudo dnf install php

# Configure Apache to handle PHP files
sudo nano /etc/httpd/conf.d/php.conf

# Add this content:
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

# Restart Apache
sudo systemctl restart httpd
sudo systemctl enable httpd

Install Nginx with PHP-FPM

Ubuntu/Debian

# Install Nginx and PHP-FPM
sudo apt install nginx php-fpm

# Configure PHP-FPM
sudo nano /etc/php/8.2/fpm/pool.d/www.conf

# Ensure these settings:
listen = /run/php/php8.2-fpm.sock
user = www-data
group = www-data

# Start PHP-FPM
sudo systemctl start php8.2-fpm
sudo systemctl enable php8.2-fpm

# Configure Nginx
sudo nano /etc/nginx/sites-available/default

# Add PHP location block:
location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}

# Restart services
sudo systemctl restart nginx
sudo systemctl restart php8.2-fpm

CentOS/RHEL

# Install Nginx and PHP-FPM
sudo dnf install nginx php-fpm

# Start and enable services
sudo systemctl start nginx
sudo systemctl start php-fpm
sudo systemctl enable nginx
sudo systemctl enable php-fpm

# Configure Nginx
sudo nano /etc/nginx/default.d/php.conf

# Add content:
location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/run/php-fpm/www.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

# Restart Nginx
sudo systemctl restart nginx

Installing Composer

Method 1: System-wide Installation

# Download Composer
curl -sS https://getcomposer.org/installer | php

# Move to system path
sudo mv composer.phar /usr/local/bin/composer

# Make executable
sudo chmod +x /usr/local/bin/composer

# Verify installation
composer --version

Method 2: Using Package Manager

Ubuntu/Debian

sudo apt install composer

CentOS/RHEL

sudo dnf install composer

Configuring PHP

Locate PHP Configuration

# Find php.ini location
php --ini

# Common locations:
# Ubuntu/Debian: /etc/php/8.2/cli/php.ini, /etc/php/8.2/apache2/php.ini
# CentOS/RHEL: /etc/php.ini
# Arch: /etc/php/php.ini

Recommended PHP Configuration

# Edit php.ini
sudo nano /etc/php/8.2/apache2/php.ini

# Important settings for development:
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
display_errors = On
error_reporting = E_ALL
date.timezone = "UTC"

# Important settings for production:
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log

Managing PHP Services

System Commands

# Check PHP-FPM status
sudo systemctl status php8.2-fpm

# Start/Stop/Restart PHP-FPM
sudo systemctl start php8.2-fpm
sudo systemctl stop php8.2-fpm
sudo systemctl restart php8.2-fpm

# Enable at boot
sudo systemctl enable php8.2-fpm

# Check Apache with PHP
sudo systemctl status apache2    # Ubuntu/Debian
sudo systemctl status httpd      # CentOS/RHEL

# Restart Apache after PHP changes
sudo systemctl restart apache2    # Ubuntu/Debian
sudo systemctl restart httpd      # CentOS/RHEL

Testing Installation

Create Test File

# For Apache
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/test.php

# For Nginx
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/test.php

# Set correct permissions
sudo chown www-data:www-data /var/www/html/test.php
sudo chmod 644 /var/www/html/test.php

Test from Browser

Visit http://your-server-ip/test.php to see PHP information page.

Test from Command Line

# Create test script
echo '<?php echo "PHP version: " . phpversion() . "\n"; ?>' > test.php

# Run it
php test.php

# Clean up
rm test.php

Multiple PHP Versions

Ubuntu with Ondrej’s PPA

# Install multiple versions
sudo apt install php8.2 php8.1 php8.0

# Update alternatives for CLI
sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.2 82
sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.1 81
sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.0 80

# Switch between versions
sudo update-alternatives --config php

# Configure different FPM pools
sudo systemctl enable php8.2-fpm
sudo systemctl enable php8.1-fpm

CentOS with Remi Repository

# Install multiple versions
sudo dnf install php82 php81 php80

# Switch default version
sudo dnf module reset php
sudo dnf module enable php:remi-8.2

Docker Installation

Using Official PHP Images

# Pull PHP image
docker pull php:8.2-apache

# Run PHP container
docker run -d -p 8080:80 -v $(pwd):/var/www/html php:8.2-apache

# With MySQL
docker-compose up -d

Docker Compose Example

version: '3.8'
services:
  php:
    image: php:8.2-apache
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
    environment:
      APACHE_DOCUMENT_ROOT: /var/www/html/public

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: myapp
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

Common Issues and Solutions

1. Module Not Found

Problem: “PHP Fatal error: Uncaught Error: Call to undefined function”

Solution:

# Find and install missing extension
sudo apt search php- | grep mysql
sudo apt install php-mysql

# Or on CentOS
sudo dnf search php- | grep mysql
sudo dnf install php-mysqlnd

2. Permission Denied

Problem: Files not accessible by web server.

Solution:

# Set correct ownership
sudo chown -R www-data:www-data /var/www/html

# Set correct permissions
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;

3. PHP-FPM Socket Issues

Problem: Nginx/Apache can’t connect to PHP-FPM.

Solution:

# Check if PHP-FPM is running
sudo systemctl status php8.2-fpm

# Check socket file
ls -la /run/php/php8.2-fpm.sock

# Restart PHP-FPM
sudo systemctl restart php8.2-fpm

4. Memory Limit Issues

Problem: Scripts failing due to memory limits.

Solution:

# Increase memory limit
sudo nano /etc/php/8.2/apache2/php.ini

# Change memory_limit
memory_limit = 512M

# Restart Apache
sudo systemctl restart apache2

Performance Optimization

OPcache Installation and Configuration

# Install OPcache
sudo apt install php-opcache    # Ubuntu/Debian
sudo dnf install php-opcache    # CentOS/RHEL

# Configure OPcache
sudo nano /etc/php/8.2/mods-available/opcache.ini

# Recommended settings:
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.revalidate_freq=0
opcache.validate_timestamps=0

PHP-FPM Tuning

# Edit pool configuration
sudo nano /etc/php/8.2/fpm/pool.d/www.conf

# Performance settings:
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500

External Resources


Related Tutorials:

Last updated on