---
  龙芯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编译失败

更多推荐