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 upgradeStep 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-zipStep 3: Verify Installation
php --versionMethod 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.2CentOS/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-releaseStep 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-mbstringMethod 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-mysqlndArch 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-mysqlMethod 2: Using AUR for Specific Versions
# Install yay AUR helper
sudo pacman -S yay
# Install specific PHP version
yay -S php82Install 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 apache2CentOS/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 httpdInstall 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-fpmCentOS/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 nginxInstalling 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 --versionMethod 2: Using Package Manager
Ubuntu/Debian
sudo apt install composerCentOS/RHEL
sudo dnf install composerConfiguring 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.iniRecommended 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.logManaging 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/RHELTesting 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.phpTest 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.phpMultiple 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-fpmCentOS 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.2Docker 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 -dDocker 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-mysqlnd2. 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-fpm4. 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 apache2Performance 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=0PHP-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 = 500External Resources
Related Tutorials:
Last updated on