---
  ThinkPHP 信创生态部署操作指南                                                                                         
  什么是信创?                                                                                                          
  信创 = 信息技术应用创新,简单说就是:用国产的操作系统、数据库、中间件替换掉 Windows/MySQL/Nginx 这些外国产品。

  ---
  一、信创技术栈全景图

  ┌─────────────────────────────────────────────────────┐
  │                   你的 ThinkPHP 应用                  │
  ├─────────────────────────────────────────────────────┤
  │  Web服务器层   │  Nginx / 东方通TongWeb / 宝兰德BES   │
  ├─────────────────────────────────────────────────────┤
  │  PHP运行时     │  PHP 7.4 / 8.0 / 8.1               │
  ├─────────────────────────────────────────────────────┤
  │  数据库层      │  达梦DM / 人大金仓KingbaseES /        │
  │               │  OpenGauss / 瀚高HighGo              │
  ├─────────────────────────────────────────────────────┤
  │  缓存层        │  Redis(国产替代:TongRDS)           │
  ├─────────────────────────────────────────────────────┤
  │  操作系统层    │  统信UOS / 麒麟Kylin / 中标麒麟       │
  └─────────────────────────────────────────────────────┘

  ---
  二、项目结构

  myapp/
  ├── app/
  │   ├── controller/
  │   ├── model/
  │   └── service/
  ├── config/
  │   ├── database.php      ← 数据库配置(重点)
  │   ├── cache.php
  │   └── app.php
  ├── extend/
  │   └── driver/           ← 自定义数据库驱动放这里
  ├── public/
  │   └── index.php
  ├── composer.json
  └── .env

  ---
  三、composer.json — 引入最佳国产适配库

  {
      "name": "mycompany/myapp",
      "require": {
          "php": ">=7.4",
          "topthink/framework": "^6.1",
          "topthink/think-orm": "^2.0",
          "topthink/think-migration": "^3.0",

          "xiaocheng-keji/think-dm": "^3.0",

          "ext-pdo": "*",
          "ext-pdo_pgsql": "*"
      },
      "require-dev": {
          "topthink/think-trace": "^1.0"
      },
      "autoload": {
          "psr-4": {
              "app\\": "app/",
              "extend\\": "extend/"
          }
      },
      "config": {
          "optimize-autoloader": true,
          "preferred-install": "dist"
      }
  }

  ▎ 大白话:xiaocheng-keji/think-dm 是目前最成熟的达梦数据库 ThinkPHP 驱动,GitHub 上有持续维护。PostgreSQL
  ▎ 系(人大金仓、OpenGauss、瀚高)直接用 PHP 自带的 pdo_pgsql 扩展就行,不需要额外装包。

  ---
  四、各国产数据库配置

  4.1 达梦数据库(DM8)

  // config/database.php
  <?php
  return [
      'default' => env('DB_DRIVER', 'dm'),

      'connections' => [

          // ===== 达梦 DM8 =====
          'dm' => [
              'type'     => '\xiaocheng\dm\Dm',  // think-dm 驱动
              'hostname' => env('DB_HOST', '192.168.1.100'),
              'database' => env('DB_NAME', 'TESTDB'),
              'username' => env('DB_USER', 'SYSDBA'),
              'password' => env('DB_PASS', 'SYSDBA001'),
              'hostport' => env('DB_PORT', '5236'),
              'charset'  => 'utf8',
              'prefix'   => 'tp_',
              'params'   => [
                  // 达梦特有:schema 名称(相当于 MySQL 的库名)
                  PDO::ATTR_STRINGIFY_FETCHES => false,
              ],
              'schema'   => env('DB_SCHEMA', 'SYSDBA'), // 达梦的 schema
          ],

          // ===== MySQL(兜底/开发用)=====
          'mysql' => [
              'type'     => 'mysql',
              'hostname' => '127.0.0.1',
              'database' => 'myapp',
              'username' => 'root',
              'password' => '',
              'hostport' => '3306',
              'charset'  => 'utf8mb4',
              'prefix'   => 'tp_',
          ],
      ],
  ];

  4.2 人大金仓 KingbaseES(PostgreSQL 兼容)

  // config/database.php 中的 connections 里加:
  'kingbase' => [
      'type'     => 'pgsql',          // 直接用 ThinkPHP 内置 pgsql 驱动
      'hostname' => env('DB_HOST', '192.168.1.101'),
      'database' => env('DB_NAME', 'test'),
      'username' => env('DB_USER', 'system'),
      'password' => env('DB_PASS', 'manager'),
      'hostport' => env('DB_PORT', '54321'),  // 金仓默认端口 54321
      'charset'  => 'utf8',
      'prefix'   => 'tp_',
      'schema'   => 'public',
      'params'   => [
          PDO::ATTR_STRINGIFY_FETCHES => false,
          PDO::ATTR_EMULATE_PREPARES  => false,
      ],
  ],

  4.3 OpenGauss / 华为 GaussDB

  'gaussdb' => [
      'type'     => 'pgsql',          // OpenGauss 完全兼容 PostgreSQL 协议
      'hostname' => env('DB_HOST', '192.168.1.102'),
      'database' => env('DB_NAME', 'postgres'),
      'username' => env('DB_USER', 'gaussdb'),
      'password' => env('DB_PASS', 'Gauss@123'),
      'hostport' => env('DB_PORT', '5432'),
      'charset'  => 'utf8',
      'prefix'   => 'tp_',
      'schema'   => 'public',
  ],

  4.4 瀚高数据库 HighGo

  'highgo' => [
      'type'     => 'pgsql',          // 瀚高基于 PostgreSQL,协议兼容
      'hostname' => env('DB_HOST', '192.168.1.103'),
      'database' => env('DB_NAME', 'highgo'),
      'username' => env('DB_USER', 'highgo'),
      'password' => env('DB_PASS', 'Hello@123'),
      'hostport' => env('DB_PORT', '5866'),  // 瀚高默认端口 5866
      'charset'  => 'utf8',
      'prefix'   => 'tp_',
      'schema'   => 'public',
  ],

  ---
  五、.env 环境变量文件

  # .env — 不同环境改这里,代码不用动

  APP_ENV=production
  APP_DEBUG=false

  # 选择用哪个数据库:dm / kingbase / gaussdb / highgo / mysql
  DB_DRIVER=dm

  DB_HOST=192.168.1.100
  DB_PORT=5236
  DB_NAME=TESTDB
  DB_USER=SYSDBA
  DB_PASS=SYSDBA001
  DB_SCHEMA=SYSDBA

  # Redis 缓存
  REDIS_HOST=127.0.0.1
  REDIS_PORT=6379
  REDIS_PASS=

  ---
  六、达梦数据库专用适配层

  达梦和 MySQL 有几个坑,需要写一个适配服务统一处理:

  <?php
  // app/service/DatabaseCompatService.php

  namespace app\service;

  /**
   * 信创数据库兼容层
   * 解决达梦/金仓与 MySQL 的 SQL 语法差异
   */
  class DatabaseCompatService
  {
      /**
       * 获取当前数据库类型
       */
      public static function getDbType(): string
      {
          $driver = config('database.default');
          return match($driver) {
              'dm'       => 'dameng',
              'kingbase' => 'kingbase',
              'gaussdb'  => 'gaussdb',
              'highgo'   => 'highgo',
              default    => 'mysql',
          };
      }

      /**
       * 判断是否是 PostgreSQL 系数据库
       * 金仓、OpenGauss、瀚高都是 PG 系
       */
      public static function isPgFamily(): bool
      {
          return in_array(self::getDbType(), ['kingbase', 'gaussdb', 'highgo']);
      }

      /**
       * 获取当前时间的 SQL 表达式
       * MySQL: NOW()  达梦: SYSDATE  PG系: NOW()
       */
      public static function nowExpr(): string
      {
          return match(self::getDbType()) {
              'dameng' => 'SYSDATE',
              default  => 'NOW()',
          };
      }

      /**
       * 字符串拼接
       * MySQL: CONCAT(a,b)  达梦/PG: a || b
       */
      public static function concat(string ...$fields): string
      {
          if (self::getDbType() === 'mysql') {
              return 'CONCAT(' . implode(',', $fields) . ')';
          }
          return implode(' || ', $fields);
      }

      /**
       * 分页 SQL
       * MySQL: LIMIT 10 OFFSET 0
       * 达梦/PG: LIMIT 10 OFFSET 0 (达梦8支持标准语法)
       */
      public static function paginate(\think\db\Query $query, int $page, int $pageSize): \think\db\Query
      {
          $offset = ($page - 1) * $pageSize;
          return $query->limit($pageSize)->page($page);
      }

      /**
       * 达梦特有:表名/字段名需要大写
       * 达梦默认大小写不敏感,但建议统一大写
       */
      public static function tableName(string $name): string
      {
          if (self::getDbType() === 'dameng') {
              return strtoupper($name);
          }
          return $name;
      }
  }

  ---
  七、Model 基类 — 屏蔽数据库差异

  <?php
  // app/model/BaseModel.php

  namespace app\model;

  use think\Model;
  use app\service\DatabaseCompatService;

  abstract class BaseModel extends Model
  {
      // 子类只需要定义这个,不用管用的是哪个数据库
      protected $connection = '';

      public function initialize(): void
      {
          // 自动选择当前配置的数据库连接
          if (empty($this->connection)) {
              $this->connection = config('database.default');
          }
          parent::initialize();
      }

      /**
       * 达梦数据库:自动处理字段名大写问题
       */
      protected function parseFieldName(string $field): string
      {
          if (DatabaseCompatService::getDbType() === 'dameng') {
              return strtoupper($field);
          }
          return $field;
      }

      /**
       * 通用软删除:兼容各数据库的时间格式
       */
      public function softDelete(): bool
      {
          return $this->save([
              'deleted_at' => date('Y-m-d H:i:s'),
              'is_deleted' => 1,
          ]);
      }
  }

  <?php
  // app/model/User.php — 实际业务 Model 示例

  namespace app\model;

  class User extends BaseModel
  {
      protected $table = 'tp_user';  // 达梦里会自动变成 TP_USER

      protected $schema = [
          'id'         => 'int',
          'username'   => 'string',
          'email'      => 'string',
          'created_at' => 'datetime',
          'updated_at' => 'datetime',
      ];

      // 达梦/PG 不支持 MySQL 的 tinyint(1) 自动转 bool,手动处理
      protected $type = [
          'is_active' => 'integer',
      ];
  }

  ---
  八、数据库迁移文件(兼容多数据库)

  <?php
  // database/migrations/20240101000001_create_user_table.php

  use think\migration\Migrator;
  use think\migration\db\Column;

  class CreateUserTable extends Migrator
  {
      public function change(): void
      {
          $table = $this->table('tp_user', [
              'engine'    => 'InnoDB',   // 达梦/PG 会忽略这个参数,不影响
              'collation' => 'utf8mb4_unicode_ci',
              'comment'   => '用户表',
          ]);

          $table
              ->addColumn('username', 'string', [
                  'limit'   => 64,
                  'null'    => false,
                  'comment' => '用户名',
              ])
              ->addColumn('email', 'string', [
                  'limit'   => 128,
                  'null'    => false,
                  'default' => '',
              ])
              ->addColumn('password', 'string', [
                  'limit' => 255,
                  'null'  => false,
              ])
              ->addColumn('is_active', 'integer', [  // 用 integer 代替 boolean,兼容性最好
                  'limit'   => 1,
                  'default' => 1,
              ])
              ->addColumn('created_at', 'datetime', ['null' => true])
              ->addColumn('updated_at', 'datetime', ['null' => true])
              ->addIndex(['username'], ['unique' => true])
              ->addIndex(['email'],    ['unique' => true])
              ->create();
      }
  }

  ---
  九、Nginx 配置(统信UOS / 麒麟 Kylin 上)

  # /etc/nginx/conf.d/myapp.conf

  server {
      listen       80;
      server_name  myapp.example.com;
      root         /opt/myapp/public;
      index        index.php;

      # ThinkPHP 标准路由重写
      location / {
          if (!-e $request_filename) {
              rewrite ^(.*)$ /index.php?s=$1 last;
          }
      }

      location ~ \.php$ {
          fastcgi_pass   127.0.0.1:9000;
          fastcgi_index  index.php;
          fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include        fastcgi_params;

          # 信创环境常见问题:PHP-FPM 超时设置长一点
          fastcgi_read_timeout 300;
          fastcgi_connect_timeout 60;
      }

      # 禁止访问敏感文件
      location ~ /\.(env|git|svn) {
          deny all;
      }

      location ~ \.(log|sql|conf)$ {
          deny all;
      }

      access_log  /var/log/nginx/myapp_access.log;
      error_log   /var/log/nginx/myapp_error.log;
  }

  ---
  十、东方通 TongWeb 适配(JavaEE 容器跑 PHP 的场景)

  ▎ 大白话:东方通 TongWeb 是 Java 应用服务器,如果你的项目要求必须跑在 TongWeb 上,通常的做法是 TongWeb
  ▎ 做反向代理,PHP-FPM 在后面跑,而不是直接在 TongWeb 里跑 PHP。

  <!-- TongWeb 反向代理配置 tongweb/conf/server.xml 片段 -->
  <Connector port="8080" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8443" />

  <!-- 反向代理到 PHP-FPM 的 Nginx -->
  <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost" appBase="webapps">
          <Context path="/" docBase="myapp">
              <!-- 静态资源直接由 TongWeb 处理 -->
          </Context>
      </Host>
  </Engine>

  实际部署架构:

  用户请求
     ↓
  东方通 TongWeb :8080
     ↓ (反向代理 /api/* 和 PHP 请求)
  Nginx :80
     ↓ (FastCGI)
  PHP-FPM :9000
     ↓
  ThinkPHP 应用
     ↓
  达梦/金仓数据库

  ---
  十一、PHP 扩展安装(麒麟/统信系统)

  # 1. 安装达梦 PHP 扩展(需要先装达梦客户端)
  # 达梦官方提供 php_pdo_dm.so

  # 把扩展复制到 PHP 扩展目录
  cp /opt/dmdbms/drivers/php/php74/php_pdo_dm.so \
     $(php -r "echo ini_get('extension_dir');")

  # 在 php.ini 中启用
  echo "extension=php_pdo_dm.so" >> /etc/php/7.4/fpm/php.ini

  # 2. 安装 PostgreSQL 扩展(金仓/OpenGauss/瀚高用)
  # 麒麟/统信 yum 源
  yum install php74-php-pdo php74-php-pgsql -y
  # 或者 apt
  apt install php7.4-pgsql -y

  # 3. 验证扩展是否加载成功
  php -m | grep -E "pdo_dm|pdo_pgsql|pdo_mysql"

  # 4. 重启 PHP-FPM
  systemctl restart php7.4-fpm

  ---
  十二、常见坑和解决方案

  ┌─────────────────────────────┬────────────────────────────────┬──────────────────────────────────────────────────┐
  │            问题             │              原因              │                     解决方案                     │
  ├─────────────────────────────┼────────────────────────────────┼──────────────────────────────────────────────────┤
  │ 达梦查询结果字段名全大写    │ 达梦默认大写标识符             │ Model 里加 protected $field                      │
  │                             │                                │ 映射,或开启达梦大小写不敏感模式                 │
  ├─────────────────────────────┼────────────────────────────────┼──────────────────────────────────────────────────┤
  │ 金仓/PG 不支持 LIMIT x,y    │ PG 语法是 LIMIT x OFFSET y     │ 用 ThinkPHP 的 ->limit()->page() 链式调用,ORM   │
  │ 语法                        │                                │ 会自动转换                                       │
  ├─────────────────────────────┼────────────────────────────────┼──────────────────────────────────────────────────┤
  │ 达梦不支持 AUTO_INCREMENT   │ 达梦用序列(SEQUENCE)实现自增 │ think-dm 驱动已处理,建表用 IDENTITY(1,1)        │
  ├─────────────────────────────┼────────────────────────────────┼──────────────────────────────────────────────────┤
  │ 统信UOS 上 PHP 版本太低     │ 系统源里只有 PHP 7.2           │ 用 Remi 源或手动编译 PHP 7.4/8.0                 │
  ├─────────────────────────────┼────────────────────────────────┼──────────────────────────────────────────────────┤
  │ 东方通 TongWeb 路径问题     │ TongWeb 的 webroot 路径配置    │ 确保 public/index.php 是入口,.htaccess 换成     │
  │                             │                                │ Nginx rewrite                                    │
  ├─────────────────────────────┼────────────────────────────────┼──────────────────────────────────────────────────┤
  │ 达梦 BOOLEAN 类型不存在     │ 达梦没有 BOOLEAN,用 NUMBER(1) │ 迁移文件用 integer 类型,Model 里手动转换        │
  ├─────────────────────────────┼────────────────────────────────┼──────────────────────────────────────────────────┤
  │ 字符集乱码                  │ 达梦默认 GB18030,PHP 是 UTF-8 │ 达梦连接串加 charset=utf8,或建库时指定 UTF-8    │
  └─────────────────────────────┴────────────────────────────────┴──────────────────────────────────────────────────┘

  ---
  十三、一键部署脚本

  #!/bin/bash
  # deploy.sh — 信创环境 ThinkPHP 部署脚本

  set -e

  APP_DIR="/opt/myapp"
  PHP_BIN="php"
  COMPOSER_BIN="composer"

  echo "=== 开始部署 ThinkPHP 信创环境 ==="

  # 1. 安装依赖
  cd "$APP_DIR"
  $COMPOSER_BIN install --no-dev --optimize-autoloader

  # 2. 设置目录权限
  chmod -R 755 "$APP_DIR"
  chmod -R 777 "$APP_DIR/runtime"
  chmod -R 777 "$APP_DIR/public/uploads" 2>/dev/null || true

  # 3. 清理缓存
  $PHP_BIN think clear

  # 4. 执行数据库迁移
  $PHP_BIN think migrate:run

  # 5. 生成路由缓存(生产环境加速)
  $PHP_BIN think optimize:route

  # 6. 重启 PHP-FPM
  systemctl restart php7.4-fpm
  systemctl reload nginx

  echo "=== 部署完成 ==="

  ---
  总结

  ┌─────────────────────┬─────────────────────────┬────────────────────────────────┐
  │       数据库        │        驱动方案         │            兼容难度            │
  ├─────────────────────┼─────────────────────────┼────────────────────────────────┤
  │ 达梦 DM8            │ xiaocheng-keji/think-dm │ ★★★ 需要注意大小写、序列、类型 │
  ├─────────────────────┼─────────────────────────┼────────────────────────────────┤
  │ 人大金仓 KingbaseES │ 内置 pgsql 驱动         │ ★★ 基本兼容,注意端口和 schema │
  ├─────────────────────┼─────────────────────────┼────────────────────────────────┤
  │ OpenGauss / GaussDB │ 内置 pgsql 驱动         │ ★★ 同上                        │
  ├─────────────────────┼─────────────────────────┼────────────────────────────────┤
  │ 瀚高 HighGo         │ 内置 pgsql 驱动         │ ★★ 同上                        │
  └─────────────────────┴─────────────────────────┴────────────────────────────────┘

  最省事的路线:优先选人大金仓或 OpenGauss(PostgreSQL 系),ThinkPHP
  内置驱动直接支持,几乎零改造。达梦需要额外装驱动包,但 think-dm 库已经封装好了大部分差异。

更多推荐