Linux 下 PHP 安装完全指南:从入门到精通

PHP(Hypertext Preprocessor)是一种广泛使用的开源服务器端脚本语言,特别适用于 Web 开发并可嵌入 HTML 中。由于其跨平台性、易用性和丰富的生态系统,PHP 成为 LAMP(Linux + Apache + MySQL + PHP)、LEMP(Linux + Nginx + MySQL + PHP)等经典 Web 架构的核心组件。在 Linux 系统中安装 PHP 是搭建 Web 服务的基础步骤,但不同的 Linux 发行版、PHP 版本和应用场景(如 CLI 脚本、Web 服务、容器化部署)可能需要不同的安装策略。

本文将详细介绍在 Linux 系统中安装 PHP 的多种方法(包管理器、源码编译、Docker 容器),配置最佳实践,常见问题排查及性能优化技巧,帮助开发者快速掌握 PHP 安装的全流程。

目录#

  1. 准备工作:系统环境与依赖检查
  2. 安装方法一:通过包管理器安装(推荐)
    • 2.1 Debian/Ubuntu 系统(apt)
    • 2.2 RHEL/CentOS 系统(yum/dnf)
    • 2.3 验证安装
  3. 安装方法二:源码编译安装(自定义需求)
    • 3.1 安装编译依赖
    • 3.2 下载 PHP 源码
    • 3.3 配置编译参数
    • 3.4 编译与安装
    • 3.5 验证源码安装
  4. 安装方法三:Docker 容器化部署(隔离与便捷)
    • 4.1 拉取 PHP 官方镜像
    • 4.2 自定义 Dockerfile 构建
    • 4.3 运行 PHP 容器
  5. PHP 配置与优化
    • 5.1 php.ini 配置文件路径
    • 5.2 核心配置参数调优
    • 5.3 扩展管理(安装/启用)
  6. 与 Web 服务器集成
    • 6.1 Apache + PHP(mod_php 或 PHP-FPM)
    • 6.2 Nginx + PHP-FPM(推荐)
  7. 常见问题与解决方案
  8. 最佳实践总结
  9. 参考资料

1. 准备工作:系统环境与依赖检查#

在安装 PHP 前,需确认 Linux 系统环境及必要依赖。

1.1 确认 Linux 发行版#

不同发行版的包管理器不同(如 Debian/Ubuntu 使用 apt,RHEL/CentOS 使用 yum/dnf),需先明确系统版本:

# 查看发行版信息
lsb_release -a  # Debian/Ubuntu 系统
cat /etc/os-release  # 通用方法

1.2 更新系统包#

安装前建议更新系统包到最新版本,避免依赖冲突:

# Debian/Ubuntu
sudo apt update && sudo apt upgrade -y
 
# RHEL/CentOS 8+
sudo dnf update -y
 
# RHEL/CentOS 7
sudo yum update -y

1.3 安装基础依赖#

无论通过哪种方式安装 PHP,以下基础工具通常需要预先安装:

# Debian/Ubuntu
sudo apt install -y wget curl gcc make autoconf libtool
 
# RHEL/CentOS
sudo dnf install -y wget curl gcc make autoconf libtool

2. 安装方法一:通过包管理器安装(推荐)#

通过系统包管理器安装是最便捷、安全的方式,适合大多数场景。官方仓库或第三方源(如 Ondřej Surý 的 PHP 源)提供了稳定的 PHP 版本。

2.1 Debian/Ubuntu 系统(apt)#

2.1.1 添加 PHP 第三方源(可选,获取新版本)#

Ubuntu 官方仓库的 PHP 版本可能较旧(如 Ubuntu 20.04 默认 PHP 7.4)。如需安装 PHP 8.0+,可添加 Ondřej Surý 的 PPA 源:

# 安装依赖
sudo apt install -y software-properties-common
 
# 添加 PPA 源
sudo add-apt-repository ppa:ondrej/php -y
 
# 更新源
sudo apt update

2.1.2 安装 PHP 及常用扩展#

根据需求选择 PHP 版本(如 8.2),并安装核心模块和扩展(如 php-fpmphp-mysqlphp-curl 等):

# 安装 PHP 8.2 及常用扩展(Web 服务场景)
sudo apt install -y php8.2 \
  php8.2-fpm \  # PHP-FPM(FastCGI 进程管理器,推荐用于 Nginx/Apache)
  php8.2-cli \  # CLI 命令行工具
  php8.2-mysql \  # MySQL 数据库扩展
  php8.2-curl \  # cURL 网络请求扩展
  php8.2-gd \  # 图像处理扩展
  php8.2-mbstring \  # 多字节字符串支持
  php8.2-xml \  # XML 解析扩展
  php8.2-zip  # ZIP 压缩支持

如需其他扩展(如 Redis、MongoDB),可直接安装对应包(如 php8.2-redis)。

2.2 RHEL/CentOS 系统(yum/dnf)#

2.2.1 添加 EPEL 和 Remi 源(获取新版本)#

RHEL/CentOS 官方仓库的 PHP 版本通常较旧,需添加 Remi 源(专注于 PHP 版本更新):

# 安装 EPEL 源(依赖)
sudo dnf install -y epel-release  # RHEL/CentOS 8+
# 或 sudo yum install -y epel-release  # RHEL/CentOS 7
 
# 安装 Remi 源
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm  # RHEL/CentOS 8
# 或 sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm  # RHEL/CentOS 7
 
# 启用 PHP 8.2 模块(Remi 源默认禁用新版本,需手动启用)
sudo dnf module enable php:remi-8.2 -y  # RHEL/CentOS 8+
# 或 sudo yum-config-manager --enable remi-php82  # RHEL/CentOS 7

2.2.2 安装 PHP 及扩展#

# 安装 PHP 8.2 及常用扩展
sudo dnf install -y php \
  php-fpm \
  php-cli \
  php-mysqlnd \  # MySQL 原生驱动(比 php-mysql 更推荐)
  php-curl \
  php-gd \
  php-mbstring \
  php-xml \
  php-zip

2.3 验证安装#

安装完成后,通过以下命令验证 PHP 版本及扩展:

# 查看 PHP 版本
php -v
 
# 查看已安装扩展
php -m  # 列出所有加载的扩展
php -i | grep "Loaded Configuration File"  # 查看 php.ini 路径

输出示例(PHP 8.2):

PHP 8.2.12 (cli) (built: Oct 24 2023 18:26:53) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.12, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.12, Copyright (c), by Zend Technologies

3. 安装方法二:源码编译安装(自定义需求)#

当需要高度自定义 PHP 配置(如特定扩展、性能优化、旧版本兼容)时,可通过源码编译安装。

3.1 安装编译依赖#

除基础工具外,还需安装 PHP 编译所需的库:

# Debian/Ubuntu
sudo apt install -y libxml2-dev libssl-dev libcurl4-openssl-dev \
  libjpeg-dev libpng-dev libfreetype6-dev libzip-dev libonig-dev
 
# RHEL/CentOS
sudo dnf install -y libxml2-devel openssl-devel libcurl-devel \
  libjpeg-turbo-devel libpng-devel freetype-devel libzip-devel oniguruma-devel

3.2 下载 PHP 源码#

PHP 官方下载页 获取源码包(以 PHP 8.2.12 为例):

wget https://www.php.net/distributions/php-8.2.12.tar.gz
tar -zxvf php-8.2.12.tar.gz
cd php-8.2.12

3.3 配置编译参数#

通过 ./configure 命令指定编译选项,核心参数说明:

参数说明
--prefix=/usr/local/php安装路径
--enable-fpm启用 PHP-FPM(用于 Web 服务)
--with-mysqli启用 MySQLi 扩展(数据库连接)
--with-pdo-mysql启用 PDO MySQL 扩展
--with-curl启用 cURL 扩展
--with-gd启用 GD 图像处理扩展
--with-mbstring启用多字节字符串支持
--enable-opcache启用 OPcache(性能优化)
--with-config-file-path=/usr/local/php/etc指定 php.ini 路径

示例配置(Web 服务场景,启用 FPM 和常用扩展):

./configure \
  --prefix=/usr/local/php \
  --enable-fpm \
  --with-fpm-user=www-data \  # FPM 运行用户(Debian/Ubuntu 通常为 www-data)
  --with-fpm-group=www-data \
  --with-mysqli \
  --with-pdo-mysql \
  --with-curl \
  --with-gd \
  --with-freetype \
  --with-jpeg \
  --with-mbstring \
  --enable-opcache \
  --with-zip \
  --with-config-file-path=/usr/local/php/etc

3.4 编译与安装#

# 编译(-j 选项指定并行任务数,加速编译,通常设为 CPU 核心数)
make -j4
 
# 安装
sudo make install

3.5 验证源码安装#

# 验证 PHP 版本
/usr/local/php/bin/php -v
 
# 复制默认配置文件
sudo cp php.ini-production /usr/local/php/etc/php.ini
sudo cp sapi/fpm/php-fpm.conf.in /usr/local/php/etc/php-fpm.conf
sudo cp sapi/fpm/www.conf.in /usr/local/php/etc/php-fpm.d/www.conf
 
# 启动 PHP-FPM(源码安装需手动配置服务)
sudo /usr/local/php/sbin/php-fpm

4. 安装方法三:Docker 容器化部署(隔离与便捷)#

Docker 容器化部署可避免系统环境冲突,适合开发环境或微服务架构。

4.1 拉取 PHP 官方镜像#

PHP 官方提供多种镜像(如 php:8.2-cliphp:8.2-fpmphp:8.2-apache):

# 拉取 PHP 8.2 FPM 镜像(用于 Nginx 集成)
docker pull php:8.2-fpm
 
# 拉取 PHP 8.2 Apache 镜像(内置 Apache 服务器)
docker pull php:8.2-apache

4.2 自定义 Dockerfile 构建#

如需添加扩展或自定义配置,可编写 Dockerfile

# 基于官方 FPM 镜像
FROM php:8.2-fpm
 
# 安装扩展(通过 docker-php-ext-install)
RUN docker-php-ext-install mysqli pdo_mysql curl gd mbstring zip
 
# 安装 OPcache 扩展(官方镜像已内置,仅需启用)
RUN docker-php-ext-enable opcache
 
# 复制自定义 php.ini
COPY php.ini /usr/local/etc/php/

构建镜像:

docker build -t my-php:8.2 .

4.3 运行 PHP 容器#

4.3.1 运行 PHP CLI 容器#

docker run --rm my-php:8.2 php -v  # 临时运行,输出 PHP 版本

4.3.2 运行 PHP-FPM 容器(与 Nginx 联动)#

创建 docker-compose.yml 实现 Nginx + PHP-FPM 联动:

version: '3'
services:
  php-fpm:
    image: my-php:8.2
    volumes:
      - ./php-code:/var/www/html  # 挂载本地代码目录
    restart: always
 
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf  # Nginx 配置
      - ./php-code:/var/www/html
    depends_on:
      - php-fpm

Nginx 配置示例(nginx.conf):

server {
    listen 80;
    root /var/www/html;
 
    location ~ \.php$ {
        fastcgi_pass php-fpm:9000;  # 连接 PHP-FPM 容器
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

启动服务:

docker-compose up -d

5. PHP 配置与优化#

PHP 核心配置通过 php.ini 文件管理,不同安装方式的路径不同:

  • 包管理器安装:/etc/php/8.2/cli/php.ini(CLI)、/etc/php/8.2/fpm/php.ini(FPM)
  • 源码安装:/usr/local/php/etc/php.ini
  • Docker 容器:/usr/local/etc/php/php.ini

5.1 核心配置参数调优#

参数推荐值(生产环境)说明
memory_limit128MPHP 脚本最大内存限制
upload_max_filesize20M单文件上传最大大小
post_max_size20MPOST 数据最大大小(需 ≥ upload_max_filesize)
max_execution_time30脚本最大执行时间(秒)
error_reportingE_ALL & ~E_DEPRECATED & ~E_STRICT错误报告级别(生产环境关闭 NOTICE)
display_errorsOff生产环境禁用错误显示(避免信息泄露)
log_errorsOn开启错误日志记录
error_log/var/log/php/error.log错误日志路径(需手动创建目录并授权)
opcache.enable1启用 OPcache(提升性能)

5.2 扩展管理(安装/启用)#

5.2.1 包管理器安装的扩展#

通过包管理器直接安装扩展(如 php8.2-redis),安装后自动启用:

# Debian/Ubuntu
sudo apt install -y php8.2-redis
 
# RHEL/CentOS
sudo dnf install -y php-redis

5.2.2 源码编译的扩展#

如需手动编译扩展(如 PECL 扩展):

# 安装 PECL(PHP 扩展库)
sudo apt install -y php-pear  # Debian/Ubuntu
# 或 sudo dnf install -y php-pear  # RHEL/CentOS
 
# 安装 Redis 扩展
sudo pecl install redis
# 启用扩展(编辑 php.ini,添加 extension=redis.so)

6. 与 Web 服务器集成#

PHP 需与 Web 服务器(Apache/Nginx)配合才能处理 HTTP 请求,常见方案有:

6.1 Apache + PHP#

6.1.1 mod_php 模块(简单但性能较低)#

包管理器安装 libapache2-mod-php 后自动启用:

# Debian/Ubuntu
sudo apt install -y libapache2-mod-php8.2
sudo a2enmod php8.2  # 启用模块
sudo systemctl restart apache2

6.1.2 PHP-FPM(推荐,性能更优)#

# 安装 PHP-FPM
sudo apt install -y php8.2-fpm
 
# 配置 Apache 转发 PHP 请求到 FPM
sudo a2enmod proxy proxy_fcgi
sudo a2enconf php8.2-fpm  # 启用 FPM 配置
sudo systemctl restart apache2

6.2 Nginx + PHP-FPM(推荐)#

Nginx 本身不处理 PHP,需通过 FastCGI 协议转发请求到 PHP-FPM:

  1. 确保 PHP-FPM 服务运行:

    sudo systemctl start php8.2-fpm
    sudo systemctl enable php8.2-fpm  # 开机自启
  2. 配置 Nginx 服务器块(示例 /etc/nginx/sites-available/default):

    server {
        listen 80;
        server_name example.com;
        root /var/www/html;
        index index.php index.html;
     
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php8.2-fpm.sock;  # FPM 监听的 Unix 套接字
        }
    }
  3. 测试并重启 Nginx:

    sudo nginx -t  # 验证配置
    sudo systemctl restart nginx

7. 常见问题与解决方案#

7.1 PHP-FPM 启动失败#

症状systemctl status php8.2-fpm 显示失败。
排查:查看日志 journalctl -u php8.2-fpm/var/log/php8.2-fpm.log
常见原因

  • 端口/套接字被占用(修改 www.conf 中的 listen 配置)。
  • 权限不足(确保 www-data 用户对日志/运行目录有读写权限)。

7.2 扩展未加载#

症状php -m 未显示目标扩展(如 redis)。
解决方案

  • 确认扩展已安装(包管理器或 PECL)。
  • 检查 php.ini 中是否添加 extension=扩展名.so
  • 重启 PHP-FPM/Apache/Nginx。

7.3 502 Bad Gateway(Nginx + FPM)#

症状:浏览器访问 PHP 页面返回 502。
常见原因

  • PHP-FPM 未运行(sudo systemctl start php8.2-fpm)。
  • Nginx 配置中 fastcgi_pass 路径错误(如套接字路径不正确)。

8. 最佳实践总结#

  1. 优先使用包管理器:简单、安全、便于更新,适合大多数场景。
  2. 生产环境禁用 display_errors:避免敏感信息泄露,通过 error_log 记录错误。
  3. 启用 OPcache:显著提升 PHP 性能(默认已启用,可调整 opcache 相关参数)。
  4. 使用 PHP-FPM:相比 mod_php,FPM 更轻量、可控,支持动态进程管理。
  5. 定期更新 PHP:及时修复安全漏洞(通过 apt upgradednf update)。
  6. 限制权限:PHP-FPM 运行用户(如 www-data)仅授予必要目录的读写权限。
  7. 容器化隔离:开发/测试环境推荐使用 Docker,避免环境冲突。

9. 参考资料#