统信UOS/麒麟系统下PHP源码编译安装与信创环境环境搭建手册=php信创
·
一、搞清楚你的环境(必看)
在开始之前,先搞清楚自己是什么系统、什么架构,后面的命令才能选对。
# 查系统版本
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
更多推荐

所有评论(0)