一、搞清楚你的环境(必看)

  在开始之前,先搞清楚自己是什么系统、什么架构,后面的命令才能选对。

  # 查系统版本
  cat /etc/os-release

  # 查 CPU 架构(重要!)
  uname -m
  # 输出 x86_64  → 普通 Intel/AMD 处理器
  # 输出 aarch64 → ARM64(鲲鹏/飞腾/龙芯等信创处理器)

  # 查内核版本
  uname -r

  # 查内存和 CPU 核数(后面编译用)
  nproc          # CPU 核数
  free -h        # 内存大小

  系统和包管理器对应关系:

  ┌──────────────────┬─────────────────┬────────────┐
  │       系统       │      版本       │  包管理器  │
  ├──────────────────┼─────────────────┼────────────┤
  │ 统信UOS 桌面版   │ V20             │ apt        │
  ├──────────────────┼─────────────────┼────────────┤
  │ 统信UOS 服务器版 │ V20             │ apt        │
  ├──────────────────┼─────────────────┼────────────┤
  │ 麒麟 Kylin       │ V10 桌面/服务器 │ apt 或 yum │
  ├──────────────────┼─────────────────┼────────────┤
  │ 麒麟 Kylin       │ V4              │ yum        │
  └──────────────────┴─────────────────┴────────────┘

  # 判断用哪个包管理器
  which apt   # 有输出就用 apt
  which yum   # 有输出就用 yum
  which dnf   # 有输出就用 dnf(新版麒麟)

  ---
  二、系统准备

  2.1 配置软件源(信创系统经常需要手动配)

  # ===== 统信UOS 配置软件源 =====
  # 备份原有源
  cp /etc/apt/sources.list /etc/apt/sources.list.bak

  # 统信UOS 官方源(根据实际版本调整)
  cat > /etc/apt/sources.list << 'EOF'
  deb [by-hash=force] https://professional-packages.chinauos.com/desktop-professional eagle main contrib non-free
  deb [by-hash=force] https://professional-packages.chinauos.com/desktop-professional eagle/sp3 main contrib non-free
  EOF

  # 更新源
  apt update


  # ===== 麒麟 Kylin V10 配置软件源(apt版)=====
  cat > /etc/apt/sources.list << 'EOF'
  deb http://archive.kylinos.cn/kylin/KYLIN-ALL 10.1 main restricted universe multiverse
  EOF

  apt update


  # ===== 麒麟 Kylin V10 配置软件源(yum版)=====
  # 查看现有 repo 文件
  ls /etc/yum.repos.d/

  # 如果没有可用源,手动添加
  cat > /etc/yum.repos.d/kylin.repo << 'EOF'
  [kylin-base]
  name=Kylin Linux Base
  baseurl=http://archive.kylinos.cn/yum/v10/
  enabled=1
  gpgcheck=0
  EOF

  yum makecache

  2.2 安装编译工具链

  # ===== apt 系统(统信UOS / 麒麟apt版)=====
  apt update && apt upgrade -y

  # 编译必须的工具
  apt install -y \
    build-essential \    # gcc g++ make 等基础编译工具
    gcc \
    g++ \
    make \
    cmake \
    autoconf \           # 自动配置工具
    automake \
    libtool \
    pkg-config \         # 库路径查找工具
    bison \              # PHP 语法解析器生成工具(必须)
    re2c \               # PHP 词法分析器生成工具(必须)
    wget \
    curl \
    git \
    vim \
    unzip


  # ===== yum/dnf 系统(麒麟yum版)=====
  yum update -y

  # 安装开发工具组(一次装好所有编译工具)
  yum groupinstall -y "Development Tools"

  # 额外必须的工具
  yum install -y \
    gcc \
    gcc-c++ \
    make \
    cmake \
    autoconf \
    automake \
    libtool \
    pkgconfig \
    bison \
    re2c \
    wget \
    curl \
    git \
    vim \
    unzip

  ---
  三、安装 PHP 编译依赖库

  大白话:PHP 有很多功能(图片处理、加密、数据库连接等),每个功能都需要对应的系统库。编译前必须把这些库的"开发版本"(带
   -dev-devel 后缀)装好。

  3.1 apt 系统(统信UOS / 麒麟apt版)

  apt install -y \
    # ===== XML 支持(PHP 必须)=====
    libxml2-dev \

    # ===== SSL/HTTPS 支持 =====
    libssl-dev \
    openssl \

    # ===== cURL 支持(HTTP请求)=====
    libcurl4-openssl-dev \

    # ===== 图片处理 =====
    libjpeg-dev \          # JPEG 图片
    libpng-dev \           # PNG 图片
    libwebp-dev \          # WebP 图片
    libfreetype6-dev \     # 字体渲染(验证码等)
    libavif-dev \          # AVIF 图片(PHP 8.1+)

    # ===== 数据库 =====
    libmysqlclient-dev \   # MySQL 客户端库
    default-libmysqlclient-dev \
    libsqlite3-dev \       # SQLite

    # ===== 字符串处理 =====
    libonig-dev \          # 多字节字符串(mbstring 必须)

    # ===== 压缩 =====
    zlib1g-dev \           # zlib 压缩
    libzip-dev \           # ZIP 文件支持
    libbz2-dev \           # BZ2 压缩

    # ===== 加密 =====
    libsodium-dev \        # 现代加密库
    libargon2-dev \        # 密码哈希

    # ===== 其他 =====
    libreadline-dev \      # 命令行编辑
    libedit-dev \
    libgmp-dev \           # 大数运算
    libldap2-dev \         # LDAP 认证
    libpq-dev \            # PostgreSQL
    libxslt1-dev \         # XSLT 转换
    libgd-dev              # GD 图形库(备用)

  3.2 yum/dnf 系统(麒麟yum版)

  yum install -y \
    # ===== XML 支持 =====
    libxml2-devel \

    # ===== SSL/HTTPS =====
    openssl-devel \
    openssl \

    # ===== cURL =====
    libcurl-devel \

    # ===== 图片处理 =====
    libjpeg-turbo-devel \
    libpng-devel \
    libwebp-devel \
    freetype-devel \

    # ===== 数据库 =====
    mysql-devel \
    mariadb-devel \
    sqlite-devel \

    # ===== 字符串 =====
    oniguruma-devel \

    # ===== 压缩 =====
    zlib-devel \
    libzip-devel \
    bzip2-devel \

    # ===== 加密 =====
    libsodium-devel \

    # ===== 其他 =====
    readline-devel \
    gmp-devel \
    openldap-devel \
    postgresql-devel \
    libxslt-devel \
    gd-devel

  3.3 验证关键库是否安装成功

  # 检查库是否存在(以 openssl 为例)
  pkg-config --exists openssl && echo "openssl: OK" || echo "openssl: 缺失"
  pkg-config --exists libcurl && echo "curl: OK" || echo "curl: 缺失"
  pkg-config --exists oniguruma && echo "oniguruma: OK" || echo "oniguruma: 缺失"
  pkg-config --exists libzip && echo "libzip: OK" || echo "libzip: 缺失"

  # 查找库文件位置
  ldconfig -p | grep libssl
  ldconfig -p | grep libmysqlclient

  ---
  四、下载 PHP 源码

  # 创建工作目录
  mkdir -p /opt/php-build
  cd /opt/php-build

  # ===== 方法1:从官网下载(需要能访问外网)=====
  PHP_VERSION="8.3.7"
  wget https://www.php.net/distributions/php-${PHP_VERSION}.tar.gz

  # ===== 方法2:从国内镜像下载(推荐,速度快)=====
  # 清华镜像
  wget https://mirrors.tuna.tsinghua.edu.cn/php/php-${PHP_VERSION}.tar.gz

  # 解压
  tar -xzf php-${PHP_VERSION}.tar.gz
  cd php-${PHP_VERSION}

  # 查看目录结构(了解一下)
  ls
  # 重要目录:
  # configure  → 配置脚本(我们要运行这个)
  # ext/       → PHP 扩展源码
  # sapi/      → PHP 运行模式(fpm、cli等)
  # Zend/      → PHP 引擎核心

  ---
  五、配置编译选项(最关键的一步)

  大白话:./configure 就是告诉编译器"我要哪些功能、装到哪里"5.1 x86_64 架构配置(统信UOS x86版 / 麒麟x86版)

  cd /opt/php-build/php-8.3.7

  ./configure \
    --prefix=/usr/local/php \                    # PHP 安装到这个目录
    --with-config-file-path=/usr/local/php/etc \ # php.ini 放这里
    --with-config-file-scan-dir=/usr/local/php/etc/php.d \ # 额外配置目录

    # ===== 运行模式 =====
    --enable-fpm \                               # 开启 PHP-FPM(Web服务必须)
    --with-fpm-user=www \                        # PHP-FPM 运行用户
    --with-fpm-group=www \                       # PHP-FPM 运行组
    --enable-cli \                               # 命令行模式

    # ===== 字符串和编码 =====
    --enable-mbstring \                          # 多字节字符串(中文必须)
    --with-iconv \                               # 字符编码转换

    # ===== 网络和加密 =====
    --with-openssl \                             # SSL/HTTPS 支持
    --with-curl \                                # cURL HTTP 请求
    --enable-sockets \                           # Socket 支持

    # ===== 数据库 =====
    --with-pdo-mysql \                           # PDO MySQL(推荐方式)
    --with-mysqli \                              # MySQLi 扩展
    --with-pdo-sqlite \                          # PDO SQLite
    --with-sqlite3 \                             # SQLite3

    # ===== 图片处理 =====
    --enable-gd \                                # GD 图形库
    --with-freetype \                            # 字体支持
    --with-jpeg \                                # JPEG 支持
    --with-webp \                                # WebP 支持

    # ===== 压缩 =====
    --with-zlib \                                # zlib 压缩
    --enable-zip \                               # ZIP 文件
    --with-bz2 \                                 # BZ2 压缩

    # ===== 性能优化 =====
    --enable-opcache \                           # OPcache 字节码缓存(必须开)
    --enable-pcntl \                             # 进程控制(Swoole等需要)
    --enable-posix \                             # POSIX 函数

    # ===== 其他常用 =====
    --enable-bcmath \                            # 高精度数学
    --enable-calendar \                          # 日历函数
    --with-gmp \                                 # 大数运算
    --enable-exif \                              # 图片EXIF信息
    --with-sodium \                              # 现代加密
    --with-password-argon2 \                     # 密码哈希
    --enable-intl \                              # 国际化
    --with-readline \                            # 命令行编辑

    # ===== 编译优化 =====
    --disable-debug \                            # 关闭调试(生产环境)
    --disable-rpath                              # 不硬编码库路径

  5.2 ARM64/aarch64 架构配置(鲲鹏/飞腾/麒麟ARM版)

  # ARM64 需要额外设置编译器标志
  export CC="gcc"
  export CXX="g++"

  # ARM64 优化编译标志
  # -march=armv8-a    → 针对 ARMv8 架构优化
  # -O2               → 二级优化(速度和大小平衡)
  # -pipe             → 用管道代替临时文件,加快编译
  export CFLAGS="-O2 -pipe -march=armv8-a"
  export CXXFLAGS="-O2 -pipe -march=armv8-a"

  # 鲲鹏处理器可以用更激进的优化
  # export CFLAGS="-O3 -pipe -march=armv8.2-a+crypto+fp16+rcpc+dotprod"

  ./configure \
    --prefix=/usr/local/php \
    --with-config-file-path=/usr/local/php/etc \
    --with-config-file-scan-dir=/usr/local/php/etc/php.d \

    # ===== ARM64 专用:指定目标架构 =====
    --host=aarch64-linux-gnu \
    --build=aarch64-linux-gnu \

    # ===== 运行模式 =====
    --enable-fpm \
    --with-fpm-user=www \
    --with-fpm-group=www \
    --enable-cli \

    # ===== 字符串和编码 =====
    --enable-mbstring \
    --with-iconv \

    # ===== 网络和加密 =====
    --with-openssl \
    --with-curl \
    --enable-sockets \

    # ===== 数据库 =====
    --with-pdo-mysql \
    --with-mysqli \
    --with-pdo-sqlite \
    --with-sqlite3 \

    # ===== 图片处理 =====
    --enable-gd \
    --with-freetype \
    --with-jpeg \
    --with-webp \

    # ===== 压缩 =====
    --with-zlib \
    --enable-zip \
    --with-bz2 \

    # ===== 性能优化 =====
    --enable-opcache \
    --enable-pcntl \
    --enable-posix \

    # ===== 其他 =====
    --enable-bcmath \
    --enable-calendar \
    --with-gmp \
    --enable-exif \
    --with-sodium \
    --with-password-argon2 \
    --enable-intl \
    --with-readline \

    # ===== 编译优化 =====
    --disable-debug \
    --disable-rpath

  5.3 configure 常见报错和解决方法

  # ===== 报错1:configure: error: Cannot find OpenSSL =====
  # 原因:openssl 开发库没装
  apt install -y libssl-dev      # apt 系统
  yum install -y openssl-devel   # yum 系统

  # 如果装了还报错,手动指定路径:
  --with-openssl=/usr/local/openssl


  # ===== 报错2:configure: error: oniguruma not found =====
  # 原因:mbstring 依赖的 oniguruma 库没装
  apt install -y libonig-dev
  yum install -y oniguruma-devel


  # ===== 报错3:configure: error: Please reinstall the libzip =====
  apt install -y libzip-dev
  yum install -y libzip-devel

  # 如果版本太旧,需要手动编译 libzip:
  cd /tmp
  wget https://libzip.org/download/libzip-1.10.1.tar.gz
  tar xzf libzip-1.10.1.tar.gz && cd libzip-1.10.1
  mkdir build && cd build
  cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
  make -j$(nproc) && make install
  # 然后告诉 pkg-config 去哪找
  export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH"


  # ===== 报错4:configure: error: Cannot find libmysqlclient =====
  apt install -y default-libmysqlclient-dev
  yum install -y mysql-devel mariadb-devel


  # ===== 报错5:ARM64 报 "unsupported architecture" =====
  # 确认 gcc 支持 aarch64
  gcc -v 2>&1 | grep Target
  # 应该输出: Target: aarch64-linux-gnu

  # 如果不对,安装交叉编译工具
  apt install -y gcc-aarch64-linux-gnu


  # ===== 报错6:bison 版本太低 =====
  bison --version  # 需要 3.0+
  # 如果版本太低,手动安装:
  cd /tmp
  wget https://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.gz
  tar xzf bison-3.8.2.tar.gz && cd bison-3.8.2
  ./configure --prefix=/usr/local
  make -j$(nproc) && make install
  export PATH="/usr/local/bin:$PATH"

  ---
  六、编译和安装

  cd /opt/php-build/php-8.3.7

  # ===== 第一步:编译 =====
  # -j$(nproc) 表示用所有 CPU 核并行编译,速度更快
  # 大白话:nproc 输出你有几个核,比如 8 核就是 make -j8
  make -j$(nproc)

  # 编译过程大概需要 5~20 分钟,取决于机器性能
  # 看到最后输出 "Build complete." 就成功了

  # 如果编译报错,先清理再重来:
  # make clean        → 清理编译产物
  # make distclean    → 彻底清理(连 configure 结果也清)


  # ===== 第二步:安装 =====
  make install

  # 安装完成后检查
  ls /usr/local/php/
  # 应该看到: bin/ etc/ include/ lib/ sbin/ var/

  /usr/local/php/bin/php -v
  # 应该输出 PHP 8.3.7 (cli) ...


  # ===== 第三步:配置环境变量 =====
  # 让系统能直接用 php 命令,不用写完整路径

  # 方法1:软链接(简单直接)
  ln -sf /usr/local/php/bin/php       /usr/local/bin/php
  ln -sf /usr/local/php/bin/phpize    /usr/local/bin/phpize
  ln -sf /usr/local/php/bin/php-config /usr/local/bin/php-config
  ln -sf /usr/local/php/sbin/php-fpm  /usr/local/sbin/php-fpm

  # 方法2:写入 PATH(推荐)
  echo 'export PATH="/usr/local/php/bin:/usr/local/php/sbin:$PATH"' >> /etc/profile
  source /etc/profile

  # 验证
  php -v
  which php  # 应该输出 /usr/local/bin/php 或 /usr/local/php/bin/php

  ---
  七、配置 PHP

  7.1 创建 php.ini

  # PHP 源码包里有两个模板
  ls /opt/php-build/php-8.3.7/
  # php.ini-development  → 开发环境模板(显示错误)
  # php.ini-production   → 生产环境模板(隐藏错误)

  # 创建配置目录
  mkdir -p /usr/local/php/etc/php.d

  # 复制生产环境模板
  cp /opt/php-build/php-8.3.7/php.ini-production /usr/local/php/etc/php.ini

  # 编辑配置
  vim /usr/local/php/etc/php.ini

  ; ===== /usr/local/php/etc/php.ini =====

  [PHP]
  ; ===== 基础设置 =====
  ; 内存限制(根据服务器内存调整)
  memory_limit = 256M

  ; 最大执行时间(秒)
  max_execution_time = 300

  ; 最大输入时间
  max_input_time = 300

  ; 上传文件大小限制
  upload_max_filesize = 100M
  post_max_size = 100M

  ; 最多上传几个文件
  max_file_uploads = 20

  ; ===== 错误处理(生产环境)=====
  ; 不在页面显示错误(安全)
  display_errors = Off
  display_startup_errors = Off

  ; 记录错误到日志
  log_errors = On
  error_log = /var/log/php/php_errors.log

  ; 错误级别(记录所有错误)
  error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

  ; ===== 时区(必须设置,否则时间函数报警告)=====
  date.timezone = Asia/Shanghai

  ; ===== 字符编码 =====
  default_charset = "UTF-8"
  mbstring.internal_encoding = UTF-8
  mbstring.language = Chinese

  ; ===== Session =====
  session.save_path = /tmp/php_sessions
  session.gc_maxlifetime = 1440
  session.cookie_httponly = 1
  session.cookie_secure = 0   ; HTTPS 环境改为 1

  ; ===== 安全设置 =====
  ; 禁用危险函数(根据需要调整)
  disable_functions = exec,passthru,shell_exec,system,proc_open,popen,parse_ini_file,show_source

  ; 隐藏 PHP 版本信息
  expose_php = Off

  ; ===== 文件路径 =====
  ; 扩展目录
  extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20230831"

  [opcache]
  ; ===== OPcache 配置(必须开启,性能提升 30~50%)=====
  opcache.enable = 1
  opcache.enable_cli = 0

  ; 缓存内存大小(MB)
  opcache.memory_consumption = 256

  ; 字符串缓存(MB)
  opcache.interned_strings_buffer = 16

  ; 最多缓存多少个 PHP 文件
  opcache.max_accelerated_files = 10000

  ; 生产环境关闭时间戳验证(提升性能,改代码后需手动清缓存)
  opcache.validate_timestamps = 0

  ; 重新验证间隔(validate_timestamps=1 时有效)
  opcache.revalidate_freq = 60

  ; ===== JIT 编译(PHP 8.0+,ARM64 收益更大)=====
  ; tracing = 追踪模式,最优选择
  opcache.jit = tracing
  opcache.jit_buffer_size = 100M

  7.2 创建 PHP-FPM 配置

  # 复制默认配置
  cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
  cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf

  # 编辑主配置
  vim /usr/local/php/etc/php-fpm.conf

  ; ===== /usr/local/php/etc/php-fpm.conf =====

  [global]
  ; PID 文件位置
  pid = /usr/local/php/var/run/php-fpm.pid

  ; 错误日志
  error_log = /usr/local/php/var/log/php-fpm.log

  ; 日志级别
  log_level = warning

  ; 紧急重启:60秒内崩溃超过5次就重启
  emergency_restart_threshold = 5
  emergency_restart_interval = 60s

  ; 子进程响应超时
  process_control_timeout = 10s

  ; 后台运行
  daemonize = yes

  ; 包含 pool 配置
  include=/usr/local/php/etc/php-fpm.d/*.conf

  ; ===== /usr/local/php/etc/php-fpm.d/www.conf =====

  [www]
  ; 运行用户(需要和 Nginx 一致)
  user = www
  group = www

  ; ===== 通信方式 =====
  ; Unix Socket(推荐,比 TCP 快)
  listen = /usr/local/php/var/run/php-fpm.sock
  listen.owner = www
  listen.group = www
  listen.mode = 0660

  ; 或者用 TCP(跨机器部署时用这个)
  ; listen = 127.0.0.1:9000

  ; 等待队列长度
  listen.backlog = 65535

  ; ===== 进程管理 =====
  ; dynamic = 动态(推荐)
  pm = dynamic

  ; 进程数计算:可用内存(MB) ÷ 单进程内存(MB,通常50~80MB)
  ; 例如 8GB 给 PHP,每进程 60MB:8192÷60≈136,取 128
  pm.max_children = 50

  ; 启动时进程数 = CPU核数 × 2
  pm.start_servers = 8

  ; 最少空闲进程数 = CPU核数
  pm.min_spare_servers = 4

  ; 最多空闲进程数 = CPU核数 × 2
  pm.max_spare_servers = 16

  ; 每个进程处理多少请求后重启(防内存泄漏)
  pm.max_requests = 5000

  ; 空闲进程超时退出
  pm.process_idle_timeout = 10s

  ; ===== 超时保护 =====
  ; 单请求最长执行时间
  request_terminate_timeout = 30s

  ; 慢请求记录阈值
  request_slowlog_timeout = 5s
  slowlog = /usr/local/php/var/log/php-fpm-slow.log

  ; ===== 访问日志 =====
  access.log = /usr/local/php/var/log/php-fpm-access.log
  access.format = "%R - %u %t \"%m %r\" %s %f %{mili}dms %{kilo}M"

  ; ===== 状态监控 =====
  pm.status_path = /fpm-status
  ping.path = /fpm-ping
  ping.response = pong

  ; ===== PHP 运行参数覆盖 =====
  php_admin_value[memory_limit] = 256M
  php_admin_value[error_log] = /var/log/php/php-fpm-error.log
  php_admin_flag[log_errors] = on
  php_admin_flag[display_errors] = off

  ---
  八、创建运行用户和目录

  # 创建 www 用户(不允许登录的系统用户)
  useradd -r -s /sbin/nologin -d /var/www www

  # 创建必要目录
  mkdir -p /var/www/html          # 网站根目录
  mkdir -p /var/log/php           # PHP 日志
  mkdir -p /tmp/php_sessions      # Session 存储
  mkdir -p /usr/local/php/var/run # PID 文件
  mkdir -p /usr/local/php/var/log # PHP-FPM 日志

  # 设置权限
  chown -R www:www /var/www/html
  chown -R www:www /var/log/php
  chown -R www:www /tmp/php_sessions
  chown -R www:www /usr/local/php/var/

  # 验证用户创建成功
  id www

  ---
  九、配置 PHP-FPM 系统服务

  # 创建 systemd 服务文件
  cat > /etc/systemd/system/php-fpm.service << 'EOF'
  [Unit]
  Description=PHP FastCGI Process Manager
  Documentation=man:php-fpm(8)
  After=network.target

  [Service]
  Type=notify

  # PID 文件路径
  PIDFile=/usr/local/php/var/run/php-fpm.pid

  # 启动命令(--nodaemonize 让 systemd 管理进程)
  ExecStart=/usr/local/php/sbin/php-fpm

更多推荐