PHP信创=龙芯LoongArch架构下PHP源码编译与生态适配实战
·
---
龙芯LoongArch架构下PHP源码编译与生态适配实战
--- 一、先搞清楚几个概念(大白话)
┌─────────────┬────────────────────────────────────────────────────────────────────────────────┐
│ 概念 │ 大白话解释 │
├─────────────┼────────────────────────────────────────────────────────────────────────────────┤
│ LoongArch │ 龙芯自研的CPU指令集,相当于龙芯的"语言",x86是英特尔的语言,ARM是手机CPU的语言 │
├─────────────┼────────────────────────────────────────────────────────────────────────────────┤
│ loongarch64 │ 64位版本的LoongArch,现在主流都用这个 │
├─────────────┼────────────────────────────────────────────────────────────────────────────────┤
│ Loongnix │ 龙芯官方出的Linux系统,基于Debian/Fedora改的 │
├─────────────┼────────────────────────────────────────────────────────────────────────────────┤
│ 编译PHP │ 把PHP源代码翻译成龙芯能看懂的机器码的过程 │
├─────────────┼────────────────────────────────────────────────────────────────────────────────┤
│ JIT │ PHP8新功能,让PHP代码运行更快;但目前官方只支持x86,龙芯上要特殊处理 │
├─────────────┼────────────────────────────────────────────────────────────────────────────────┤
│ OPcache │ PHP的字节码缓存,龙芯上可以正常用,比JIT稳 │
└─────────────┴────────────────────────────────────────────────────────────────────────────────┘
---
二、环境准备
2.1 确认你的系统
# 查看CPU架构,应该输出 loongarch64
uname -m
# 查看操作系统版本
cat /etc/os-release
# 查看GCC版本,需要GCC 12+才能完整支持LoongArch
gcc --version
为什么GCC要12+?
因为LoongArch是2020年才推出的新架构,老版GCC根本不认识这个指令集,就像你拿1990年的字典查2020年的网络词语,肯定查不到。
2.2 安装编译依赖
Loongnix Server(基于Fedora/CentOS系):
# 更新包管理器
sudo yum update -y
# 安装编译工具链
sudo yum groupinstall -y "Development Tools"
# 安装PHP编译必须的依赖库
sudo yum install -y \
gcc \
gcc-c++ \
make \
autoconf \
automake \
libtool \
pkg-config \
bison \
re2c \
libxml2-devel \
openssl-devel \
curl-devel \
libpng-devel \
libjpeg-devel \
libwebp-devel \
freetype-devel \
libzip-devel \
zlib-devel \
libsqlite3x-devel \
oniguruma-devel \
readline-devel \
libsodium-devel \
gmp-devel \
libffi-devel
Loongnix Desktop(基于Debian系):
sudo apt update
sudo apt install -y \
build-essential \
autoconf \
bison \
re2c \
pkg-config \
libxml2-dev \
libssl-dev \
libcurl4-openssl-dev \
libpng-dev \
libjpeg-dev \
libwebp-dev \
libfreetype-dev \
libzip-dev \
zlib1g-dev \
libsqlite3-dev \
libonig-dev \
libreadline-dev \
libsodium-dev \
libgmp-dev \
libffi-dev
依赖这么多干什么用? 举例说明:
- libxml2 → PHP解析XML用的
- openssl → PHP的HTTPS功能用的
- libpng/libjpeg → PHP的图像处理(GD库)用的
- oniguruma → PHP的正则表达式用的
- libzip → PHP操作ZIP文件用的
---
三、下载PHP源码
# 创建工作目录
mkdir -p /opt/php-build
cd /opt/php-build
# 下载PHP 8.3源码(当前推荐稳定版)
wget https://www.php.net/distributions/php-8.3.10.tar.gz
# 解压
tar -xzf php-8.3.10.tar.gz
cd php-8.3.10
---
四、关键步骤:处理LoongArch架构识别问题
这是龙芯适配最容易踩坑的地方!
4.1 问题根源(大白话)
PHP里有个叫 config.guess 的脚本,它的工作就是识别"你现在用的是什么CPU架构"。问题是这个脚本可能是老版本的,根本不认识
loongarch64,就像问一个1990年出生的人"你知道B站吗",他可能没听过。
# 先检查现有的config.guess能不能识别loongarch64
./config.guess
# 如果输出里没有 loongarch64,就需要更新它
4.2 解决方案:更新config.guess和config.sub
# 方法一:直接从GNU官方下载最新版本(推荐)
wget -O config.guess 'https://git.savannah.gnu.org/cgit/config.git/plain/config.guess'
wget -O config.sub 'https://git.savannah.gnu.org/cgit/config.git/plain/config.sub'
# 给执行权限
chmod +x config.guess config.sub
# 验证
./config.guess
# 正确输出应该包含:loongarch64-unknown-linux-gnu
# 方法二:如果网络不好,手动替换(适合离线环境)
# 先安装autoconf-archive,里面包含最新的config文件
sudo yum install -y autoconf-archive # Fedora系
# 或
sudo apt install -y autoconf-archive # Debian系
# 复制系统里的新版config文件
cp /usr/share/automake-*/config.guess ./config.guess
cp /usr/share/automake-*/config.sub ./config.sub
---
五、执行configure配置(核心步骤)
这一步就是告诉PHP"我要编译哪些功能、装到哪个目录"。
5.1 标准版配置(推荐大多数场景)
./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-config-file-scan-dir=/usr/local/php/etc/php.d \
--with-libdir=lib64 \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--enable-opcache \
--disable-opcache-jit \
--enable-mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-openssl \
--with-curl \
--with-zlib \
--enable-mbstring \
--enable-bcmath \
--enable-gd \
--with-jpeg \
--with-png \
--with-webp \
--with-freetype \
--with-zip \
--enable-soap \
--enable-xml \
--enable-json \
--enable-ctype \
--enable-tokenizer \
--enable-fileinfo \
--enable-dom \
--enable-simplexml \
--enable-xmlreader \
--enable-xmlwriter \
--enable-phar \
--enable-filter \
--enable-session \
--with-readline \
--enable-sockets \
--enable-pcntl \
--enable-posix \
--with-sodium \
--with-gmp \
--enable-intl \
2>&1 | tee configure.log
逐行解释最重要的几个参数:
┌──────────────────────────┬───────────────────────────────────────────────────────────────┐
│ 参数 │ 大白话意思 │
├──────────────────────────┼───────────────────────────────────────────────────────────────┤
│ --prefix=/usr/local/php │ PHP装到这个目录,就像Windows安装到C:\Program Files │
├──────────────────────────┼───────────────────────────────────────────────────────────────┤
│ --with-libdir=lib64 │ 龙芯64位必须加这个,告诉编译器去lib64目录找库文件,不然找不到 │
├──────────────────────────┼───────────────────────────────────────────────────────────────┤
│ --enable-fpm │ 开启PHP-FPM,配合Nginx使用必须开 │
├──────────────────────────┼───────────────────────────────────────────────────────────────┤
│ --enable-opcache │ 开启字节码缓存,让PHP快很多 │
├──────────────────────────┼───────────────────────────────────────────────────────────────┤
│ --disable-opcache-jit │ 龙芯关键:关闭JIT,因为PHP官方JIT不支持loongarch64 │
├──────────────────────────┼───────────────────────────────────────────────────────────────┤
│ --with-pdo-mysql=mysqlnd │ 用PHP内置的MySQL驱动,不依赖外部libmysql │
└──────────────────────────┴───────────────────────────────────────────────────────────────┘
5.2 如果configure失败,常见错误处理
# 错误1:找不到某个库
# 报错类似:configure: error: Cannot find OpenSSL's libraries
# 解决:用pkg-config检查库是否安装
pkg-config --libs openssl
# 如果没输出,说明没装
sudo yum install openssl-devel
# 或者手动指定路径
export PKG_CONFIG_PATH=/usr/local/openssl/lib/pkgconfig:$PKG_CONFIG_PATH
# 错误2:架构不识别
# 报错:configure: error: cannot guess build type
# 解决:重新下载config.guess(见第四章)
# 或者直接指定
./configure --build=loongarch64-linux-gnu --host=loongarch64-linux-gnu [其他参数]
# 错误3:bison版本太低
# 报错:expected bison at least version 3.0.0, got 2.x.x
# 解决
sudo yum install bison
bison --version # 确认版本
---
六、编译和安装
# 编译(-j 后面是CPU核心数,龙芯服务器一般4-16核,按实际填)
make -j$(nproc) 2>&1 | tee make.log
# 查看有没有编译错误(没有输出说明成功)
grep -i "error:" make.log | grep -v "warning"
# 安装
sudo make install
为什么要 -j$(nproc)? $(nproc) 会自动获取CPU核心数,多核并行编译,龙芯3A6000有4个核就能同时编译4个文件,比单核快4倍。
---
七、配置PHP环境
7.1 配置环境变量
# 把PHP加入系统PATH
echo 'export PATH=/usr/local/php/bin:/usr/local/php/sbin:$PATH' >> /etc/profile
source /etc/profile
# 验证
php -v
# 应该输出类似:PHP 8.3.10 (cli) (built: ...)
7.2 创建php.ini配置文件
# PHP源码里有两个示例配置,生产环境用production版本
cp /opt/php-build/php-8.3.10/php.ini-production /usr/local/php/etc/php.ini
# 创建额外配置目录
mkdir -p /usr/local/php/etc/php.d
7.3 针对龙芯的php.ini关键配置
cat > /usr/local/php/etc/php.d/loongarch.ini << 'EOF'
; ===== OPcache配置(龙芯优化版)=====
; 开启OPcache(可以用,比JIT稳)
opcache.enable=1
; CLI模式下不开(避免命令行工具出问题)
opcache.enable_cli=0
; 给OPcache分配128MB内存
opcache.memory_consumption=128
; 最多缓存10000个PHP文件
opcache.max_accelerated_files=10000
; 每60秒检查文件是否变化(生产环境设0,手动清缓存)
opcache.revalidate_freq=60
; 龙芯关键:JIT buffer设为0,禁用JIT
opcache.jit_buffer_size=0
; ===== 基础性能配置 =====
; 最大执行时间30秒
max_execution_time = 30
; 最大内存256MB
memory_limit = 256M
; 最大上传文件64MB
upload_max_filesize = 64M
post_max_size = 64M
; ===== 错误处理 =====
; 生产环境不显示错误
display_errors = Off
; 但要记录错误日志
log_errors = On
error_log = /var/log/php/error.log
EOF
---
八、配置PHP-FPM(配合Nginx使用)
8.1 创建www用户
# 创建专用用户(安全原则:不用root跑Web服务)
groupadd www
useradd -g www -s /sbin/nologin -M www
8.2 配置php-fpm.conf
# 复制示例配置
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
# 编辑www.conf,关键配置项
cat > /usr/local/php/etc/php-fpm.d/www.conf << 'EOF'
[www]
; 运行用户(必须和Nginx一致)
user = www
group = www
; 监听方式:Unix socket比TCP性能更好
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = www
listen.group = www
listen.mode = 0660
; 进程管理模式:dynamic=动态,适合大多数场景
pm = dynamic
; 最大子进程数(根据内存计算,每个进程约30-50MB)
pm.max_children = 20
; 启动时创建的进程数
pm.start_servers = 5
; 最少保持的空闲进程
pm.min_spare_servers = 3
; 最多保持的空闲进程
pm.max_spare_servers = 10
; 每个进程处理500个请求后重启(防内存泄漏)
pm.max_requests = 500
EOF
# 创建socket目录
mkdir -p /var/run/php-fpm
chown www:www /var/run/php-fpm
8.3 创建systemd服务
cat > /etc/systemd/system/php-fpm.service << 'EOF'
[Unit]
Description=PHP FastCGI Process Manager
After=network.target
[Service]
Type=forking
PIDFile=/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
PrivateTmp=true
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 启动服务
systemctl daemon-reload
systemctl enable php-fpm
systemctl start php-fpm
systemctl status php-fpm
---
九、安装常用扩展
9.1 Redis扩展(最常用)
# 先安装Redis服务
sudo yum install redis -y
sudo systemctl start redis
# 下载phpredis扩展源码
cd /opt/php-build
wget https://github.com/phpredis/phpredis/archive/refs/tags/6.0.2.tar.gz -O phpredis-6.0.2.tar.gz
tar -xzf phpredis-6.0.2.tar.gz
cd phpredis-6.0.2
# phpize:把PHP扩展的构建系统准备好(必须先执行)
/usr/local/php/bin/phpize
# 配置(指向你刚编译的PHP)
./configure --with-php-config=/usr/local/php/bin/php-config
# 编译安装
make -j$(nproc)
sudo make install
# 告诉PHP加载这个扩展
echo "extension=redis.so" > /usr/local/php/etc/php.d/redis.ini
# 验证
php -m | grep redis
9.2 Swoole扩展(高性能协程框架)
cd /opt/php-build
wget https://github.com/swoole/swoole-src/archive/refs/tags/v5.1.3.tar.gz -O swoole-5.1.3.tar.gz
tar -xzf swoole-5.1.3.tar.gz
cd swoole-src-5.1.3
/usr/local/php/bin/phpize
# Swoole需要额外开启一些特性
./configure \
--with-php-config=/usr/local/php/bin/php-config \
--enable-swoole-curl \
--enable-openssl \
--with-openssl-dir=/usr
make -j$(nproc)
sudo make install
echo "extension=swoole.so" > /usr/local/php/etc/php.d/swoole.ini
# 验证
php --ri swoole
Swoole在龙芯上要注意的坑:
# Swoole的协程底层用了汇编代码实现上下文切换
# 龙芯架构需要v5.0.3+才有loongarch64支持
# 如果报错类似 "context switch not supported"
# 请确认swoole版本 >= 5.0.3
9.3 imagick扩展(图像处理)
# 先装ImageMagick开发库
sudo yum install ImageMagick-devel -y
cd /opt/php-build
wget https://pecl.php.net/get/imagick-3.7.0.tgz
tar -xzf imagick-3.7.0.tgz
cd imagick-3.7.0
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make -j$(nproc)
sudo make install
echo "extension=imagick.so" > /usr/local/php/etc/php.d/imagick.ini
9.4 通过PECL安装扩展(更简单的方式)
# PECL是PHP官方扩展包管理器
/usr/local/php/bin/pecl channel-update pecl.php.net
# 安装mongodb扩展
/usr/local/php/bin/pecl install mongodb
echo "extension=mongodb.so" > /usr/local/php/etc/php.d/mongodb.ini
---
十、龙芯特有的适配问题与解决方案
10.1 问题汇总表
┌─────────────────────────┬─────────────────────────────────────┬──────────────────────────────┐
│ 问题 │ 原因 │ 解决方案 │
├─────────────────────────┼─────────────────────────────────────┼──────────────────────────────┤
│ cannot guess build type │ config.guess太老,不认识loongarch64 │ 更新config.guess(见第四章) │
├─────────────────────────┼─────────────────────────────────────┼──────────────────────────────┤
│ JIT编译失败 │ PHP JIT用DynASM写的,只支持x86 │ --disable-opcache-jit │
├─────────────────────────┼─────────────────────────────────────┼──────────────────────────────┤
│ 某些扩展找不到.so │ lib路径问题 │ --with-libdir=lib64 │
├─────────────────────────┼─────────────────────────────────────┼──────────────────────────────┤
│ autoconf报错 │ 版本太低 │ yum install autoconf │
├─────────────────────────┼─────────────────────────────────────┼──────────────────────────────┤
│ 编译时内存不足 │ 龙芯服务器内存较小 │ make -j2 减少并发 │
└─────────────────────────┴─────────────────────────────────────┴──────────────────────────────┘
10.2 PHP配置验证脚本
<?php
// 保存为 /var/www/html/phpinfo_check.php
// 访问这个页面验证编译结果
$checks = [
'PHP版本' => PHP_VERSION,
'CPU架构' => PHP_INT_SIZE === 8 ? '64位' : '32位',
'系统架构' => php_uname('m'),
'OPcache状态' => extension_loaded('opcache') ? '已启用' : '未启用',
'JIT状态' => function() {
if (!extension_loaded('opcache')) return '无OPcache';
$status = opcache_get_status();
if (!isset($status['jit'])) return 'JIT不可用(正常,龙芯架构)';
return $status['jit']['enabled'] ? '已启用' : '已禁用';
},
'Redis扩展' => extension_loaded('redis') ? '已安装' : '未安装',
'Swoole扩展' => extension_loaded('swoole') ? '已安装' : '未安装',
'PDO MySQL' => extension_loaded('pdo_mysql') ? '已安装' : '未安装',
'GD图像库' => extension_loaded('gd') ? '已安装' : '未安装',
'OpenSSL版本' => OPENSSL_VERSION_TEXT,
];
echo "=== 龙芯LoongArch PHP环境检查 ===\n";
foreach ($checks as $key => $value) {
if (is_callable($value)) {
$value = $value();
}
printf("%-20s: %s\n", $key, $value);
}
// 内存使用测试
echo "\n=== 性能基准 ===\n";
$start = microtime(true);
$arr = range(1, 100000);
sort($arr);
$time = microtime(true) - $start;
echo "100000元素排序耗时: " . round($time * 1000, 2) . "ms\n";
// OPcache详情
if (extension_loaded('opcache')) {
echo "\n=== OPcache详情 ===\n";
$status = opcache_get_status(false);
echo "已缓存脚本数: " . $status['opcache_statistics']['num_cached_scripts'] . "\n";
echo "内存使用: " . round($status['memory_usage']['used_memory'] / 1024 / 1024, 2) . "MB\n";
echo "内存空闲: " . round($status['memory_usage']['free_memory'] / 1024 / 1024, 2) . "MB\n";
}
10.3 性能优化:没有JIT怎么弥补
龙芯没有JIT不用慌,以下方案能补回来:
# 1. 开启OPcache预加载(PHP 7.4+)
# 把框架核心代码提前编译好放内存里
cat >> /usr/local/php/etc/php.ini << 'EOF'
; 预加载脚本(以Laravel为例)
opcache.preload=/var/www/html/preload.php
opcache.preload_user=www
EOF
<?php
// /var/www/html/preload.php
// 把Laravel/ThinkPHP核心文件预加载进内存
// 这样每次请求不用重新编译这些文件
$directory = '/var/www/html/vendor/laravel/framework/src';
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($directory)
);
foreach ($iterator as $file) {
if ($file->isFile() && $file->getExtension() === 'php') {
opcache_compile_file($file->getPathname());
}
}
echo "预加载完成\n";
; php.ini里还可以优化
; 字符串缓存,减少重复字符串的内存占用
opcache.interned_strings_buffer=16
; 快速关闭:跳过不必要的清理(提升性能)
opcache.fast_shutdown=1
; 文件缓存:把OPcache持久化到磁盘
; 重启PHP后不需要重新预热
opcache.file_cache=/tmp/opcache
opcache.file_cache_consistency_checks=0
---
十一、完整的自动化编译脚本
#!/bin/bash
# 文件名:build_php_loongarch.sh
# 用途:龙芯LoongArch下一键编译PHP 8.3
# 使用:chmod +x build_php_loongarch.sh && sudo ./build_php_loongarch.sh
set -e # 任何命令失败就停止
PHP_VERSION="8.3.10"
INSTALL_DIR="/usr/local/php"
BUILD_DIR="/opt/php-build"
PHP_USER="www"
# 颜色输出(让日志好看点)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# 检查架构
ARCH=$(uname -m)
log_info "当前架构: $ARCH"
if [ "$ARCH" != "loongarch64" ]; then
log_warn "当前不是loongarch64架构,脚本仍可运行,但部分配置可能不适用"
fi
# 创建目录
mkdir -p "$BUILD_DIR"
cd "$BUILD_DIR"
# 下载源码
if [ ! -f "php-${PHP_VERSION}.tar.gz" ]; then
log_info "下载PHP ${PHP_VERSION}源码..."
wget "https://www.php.net/distributions/php-${PHP_VERSION}.tar.gz"
fi
# 解压
if [ ! -d "php-${PHP_VERSION}" ]; then
log_info "解压源码..."
tar -xzf "php-${PHP_VERSION}.tar.gz"
fi
cd "php-${PHP_VERSION}"
# 更新config.guess(龙芯架构关键步骤)
log_info "更新架构识别文件..."
# 优先从系统automake获取,失败则从网络下载
if cp /usr/share/automake-*/config.guess ./config.guess 2>/dev/null; then
cp /usr/share/automake-*/config.sub ./config.sub
log_info "已从系统automake更新config文件"
else
log_warn "从网络下载config.guess..."
wget -q -O config.guess 'https://git.savannah.gnu.org/cgit/config.git/plain/config.guess' || true
wget -q -O config.sub 'https://git.savannah.gnu.org/cgit/config.git/plain/config.sub' || true
fi
chmod +x config.guess config.sub 2>/dev/null || true
# 运行configure
log_info "运行configure配置..."
./configure \
--prefix="$INSTALL_DIR" \
--with-config-file-path="${INSTALL_DIR}/etc" \
--with-config-file-scan-dir="${INSTALL_DIR}/etc/php.d" \
--with-libdir=lib64 \
--enable-fpm \
--with-fpm-user="$PHP_USER" \
--with-fpm-group="$PHP_USER" \
--enable-opcache \
--disable-opcache-jit \
--enable-mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-openssl \
--with-curl \
--with-zlib \
--enable-mbstring \
--enable-bcmath \
--enable-gd \
--with-jpeg \
--with-zip \
--enable-soap \
--enable-xml \
--enable-json \
--enable-ctype \
--enable-fileinfo \
--enable-dom \
--enable-simplexml \
--enable-phar \
--enable-filter \
--enable-session \
--with-readline \
--enable-sockets \
--enable-pcntl \
--enable-posix \
--with-sodium \
--with-gmp \
2>&1 | tee "${BUILD_DIR}/configure.log"
log_info "configure完成,开始编译..."
# 编译(使用所有CPU核心)
CORES=$(nproc)
log_info "使用 ${CORES} 个CPU核心并行编译..."
make -j"$CORES" 2>&1 | tee "${BUILD_DIR}/make.log"
# 检查编译错误
if grep -i "^make\[.*\]: \*\*\*" "${BUILD_DIR}/make.log"; then
log_error "编译失败!请检查 ${BUILD_DIR}/make.log"
exit 1
fi
log_info "编译成功,开始安装..."
make install
# 配置环境变量
if ! grep -q "${INSTALL_DIR}/bin" /etc/profile; then
echo "export PATH=${INSTALL_DIR}/bin:${INSTALL_DIR}/sbin:\$PATH" >> /etc/profile
fi
# 复制配置文件
cp "${BUILD_DIR}/php-${PHP_VERSION}/php.ini-production" "${INSTALL_DIR}/etc/php.ini"
mkdir -p "${INSTALL_DIR}/etc/php.d"
cp "${INSTALL_DIR}/etc/php-fpm.conf.default" "${INSTALL_DIR}/etc/php-fpm.conf"
cp "${INSTALL_DIR}/etc/php-fpm.d/www.conf.default" "${INSTALL_DIR}/etc/php-fpm.d/www.conf"
# 创建PHP用户
if ! id "$PHP_USER" &>/dev/null; then
groupadd "$PHP_USER"
useradd -g "$PHP_USER" -s /sbin/nologin -M "$PHP_USER"
fi
# 写入龙芯优化配置
cat > "${INSTALL_DIR}/etc/php.d/loongarch-optimize.ini" << 'INIEOF'
; 龙芯LoongArch优化配置
opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
; 龙芯不支持JIT,必须禁用
opcache.jit_buffer_size=0
memory_limit=256M
max_execution_time=30
upload_max_filesize=64M
post_max_size=64M
INIEOF
log_info "==========================================="
log_info "PHP ${PHP_VERSION} 在龙芯LoongArch上安装完成!"
log_info "安装目录: ${INSTALL_DIR}"
log_info "PHP路径: ${INSTALL_DIR}/bin/php"
log_info ""
log_info "运行以下命令使环境变量生效:"
log_info " source /etc/profile"
log_info ""
log_info "验证安装:"
log_info " php -v"
log_info " php -m | grep opcache"
log_info "==========================================="
---
十二、Nginx + PHP-FPM完整配置
# /etc/nginx/conf.d/php-app.conf
server {
listen 80;
server_name your-domain.com;
root /var/www/html;
index index.php index.html;
# 访问日志
access_log /var/log/nginx/php-app.access.log;
error_log /var/log/nginx/php-app.error.log;
# PHP文件交给PHP-FPM处理
location ~ \.php$ {
# 使用Unix socket(比TCP快)
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# 龙芯服务器CPU性能相对保守,适当延长超时
fastcgi_read_timeout 60;
fastcgi_connect_timeout 10;
}
# 拒绝访问隐藏文件(安全)
location ~ /\. {
deny all;
}
}
---
十三、验证整个环境是否正常
#!/bin/bash
# 验证脚本
echo "=== 龙芯PHP环境验证 ==="
echo ""
echo "1. PHP版本:"
/usr/local/php/bin/php -v
echo ""
echo "2. 已加载扩展:"
/usr/local/php/bin/php -m
echo ""
echo "3. OPcache状态:"
/usr/local/php/bin/php -r "
if (extension_loaded('opcache')) {
echo 'OPcache已启用' . PHP_EOL;
\$status = opcache_get_status(false);
echo '缓存命中率: ' . round(\$status['opcache_statistics']['opcache_hit_rate'], 2) . '%' . PHP_EOL;
} else {
echo 'OPcache未启用,请检查配置' . PHP_EOL;
}
"
echo ""
echo "4. PHP-FPM状态:"
systemctl is-active php-fpm
echo ""
echo "5. 架构确认:"
/usr/local/php/bin/php -r "echo 'PHP运行架构: ' . php_uname('m') . PHP_EOL;"
---
总结
┌───────────┬───────────────────────────┬─────────────────────────────────────────────┐
│ 阶段 │ 关键操作 │ 龙芯特殊点 │
├───────────┼───────────────────────────┼─────────────────────────────────────────────┤
│ 环境准备 │ 装依赖库 │ GCC需12+,确认loongarch64支持 │
├───────────┼───────────────────────────┼─────────────────────────────────────────────┤
│ 架构识别 │ 更新config.guess │ 必须做,否则configure报错 │
├───────────┼───────────────────────────┼─────────────────────────────────────────────┤
│ configure │ 指定编译选项 │ --with-libdir=lib64 + --disable-opcache-jit │
├───────────┼───────────────────────────┼─────────────────────────────────────────────┤
│ 编译安装 │ make -j │ 正常流程,无特殊 │
├───────────┼───────────────────────────┼─────────────────────────────────────────────┤
│ 扩展适配 │ phpize + configure + make │ Swoole需v5.0.3+才支持loongarch64 │
├───────────┼───────────────────────────┼─────────────────────────────────────────────┤
│ 性能优化 │ OPcache预加载 │ 没有JIT用预加载弥补 │
└───────────┴───────────────────────────┴─────────────────────────────────────────────┘
最重要的三点:
1. 更新 config.guess 让autoconf认识loongarch64
2. 加 --with-libdir=lib64 找对库文件
3. 加 --disable-opcache-jit 避免JIT编译失败
更多推荐
所有评论(0)