PHP信创=ThinkPHPThinkPHP信创生态部署操作指南与国产中间件适配方案
·
---
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 库已经封装好了大部分差异。
更多推荐


所有评论(0)