MintHCM 配置参数详解

MintHCM 4.3.5 三层配置体系详解:legacy/config.php 数据库/站点/日志/分页/ES 前缀/cron/安全段逐项语义,api 层 $mint_config 与 php.ini 上传链,6 组改动→观察→恢复的生效性实测实录(含 config_override.php 覆盖层验证)。

MintHCM人力资源管理Debian122026/10/28

MintHCM 配置参数详解

MintHCM 4.3.5 的配置分三层:legacy/config.php(主配置,单一事实来源)→ legacy/config_override.php(升级安全覆盖层)→ PHP/Apache 运行层。本文基于 Debian 12 实测部署出的环境,逐段讲解主配置文件全部关键参数的语义与取值,并对 6 组关键参数做了改动→观察→恢复的生效性验证,验证实录全部照实引用。前置认知见《MintHCM 介绍与选型指南》,参数修改后的排障与命令操作见《MintHCM 常用 CLI 命令详解》。

实测环境基线:Debian 12 / Apache 2.4.68 / PHP 8.2.35 / MariaDB 10.11.19 / Elasticsearch 7.17.28 / MintHCM 4.3.5,应用根 /var/www/minthcm,管理员 admin / q1w2e3r4。

一、三层配置总览

层文件职责生效方式
主配置/var/www/minthcm/legacy/config.php安装器生成(实测 511 行),数据库、站点、日志、搜索、cron 全部运行参数PHP 每次请求即读,改动即生效,无需重启
覆盖层/var/www/minthcm/legacy/config_override.phpSuiteCRM 血统的升级安全机制:手工/工具写在这里的键会覆盖 config.php 同名键,版本升级不会冲掉同上,删除文件即还原
运行层/etc/php/8.2/apache2/php.ini、/etc/apache2/...、/var/www/minthcm/.htaccess上传上限、内存、安全响应头、重写路由php.ini 改后需 systemctl restart apache2;.htaccess 即改即生效

实测确认覆盖层:向 config_override.php 写入 $sugar_config["list_max_entries_per_page"] = 7; 后 Users 列表立即从 19 行变为 7 行;删除文件后恢复 19 行(第九节实录 4)。

二、legacy/config.php 逐段详解

以下参数名、默认值均摘自实测环境安装器生成的 config.php(行号为实测文件行号),语义按官方代码行为描述。

2.1 数据库段(第 134~155 行)

'dbconfig' => array (
    'db_host_name' => 'localhost',
    'db_host_instance' => '',
    'db_user_name' => 'root',
    'db_password' => 'q1w2e3r4',
    'db_name' => 'minthcm',
    'db_type' => 'mysql',        // 实为 MariaDB/MySQL 通用驱动
    'db_port' => '3306',
    'db_manager' => 'MysqliManager',
),
'dbconfigoption' => array (
    'persistent' => true,        // 持久连接,降低连接开销
    'autofree' => false,
    'debug' => 0,                // 置 1 可在日志打印 SQL
    'ssl' => false,              // 数据库 TLS,跨机部署建议开启
    'collation' => 'utf8mb4_general_ci',
    'charset' => 'utf8mb4',
),

要点:db_type 值叫 mysql,但驱动管理器是 MysqliManager,MariaDB 10.11 实测完全兼容;dbconfigoption.debug 置 1 后 SQL 会打进 minthcm.log,是排查数据问题的第一开关,排查完务必改回 0。

2.2 站点段

参数实测默认值语义
site_url(403 行)http://10.89.71.2:8147/对外访问根地址,MintCLI 安装时从 System URL Address 写入;改端口/域名必须同步改它,否则登录跳转与 OAuth 回调会错乱
host_name(258 行)10.89.71.2服务器标识,用于生成绝对链接
default_language(168 行)en_us默认界面语言,取值必须存在于 languages 数组
languages(280 行)array('en_us' => 'English (US)')已安装语言包清单;装新语言包(官方 Crowdin 分发)后数组自动多一项,才可被 default_language 引用
default_module(171 行)Home登录后默认落地的模块
default_theme(187 行)SuiteP默认皮肤
max_dashlets_homepage(309 行)15首页仪表板最多小部件数

2.3 日志段(第 293~302 行)

'log_file' => 'minthcm.log',      // 落在 legacy/ 目录下
'log_memory_usage' => false,
'logger' => array (
    'level' => 'fatal',           // fatal|error|warn|info|debug,级别从紧到松
    'file' => array ('ext' => '.log', 'name' => 'minthcm', 'dateFormat' => '%c', ...),
),

安装器默认 fatal——出问题才看日志时几乎总是空文件,这是新手排障最常踩的坑。验证实录见第九节:debug 级别下一轮 cron.php 即产出 38 行 DEBUG。另有独立的 legacy/search_index.log 记录 ES 索引管道(ElasticSearchIndexer.DEBUG/INFO 前缀)。

2.4 列表与分页段

参数实测默认值语义
list_max_entries_per_page(287 行)20列表视图每页行数,改动即时生效(第九节实录 1)
list_max_entries_per_subpanel(288 行)10子面板(如员工详情下的关联列表)每页行数
save_query(364 行附近)all列表查询缓存策略

2.5 搜索与 Elasticsearch 段

'elasticsearch_index_prefix' => '1e4a',   // 201 行,ES 索引名前缀,安装时随机生成
'search' => array (
    'controller' => 'UnifiedSearch',
    'defaultEngine' => 'BasicSearchEngine',
    'pagination' => array ('min' => 10, 'max' => 50, 'step' => 10, 'default_limit' => 1000),
),

elasticsearch_index_prefix 是实例级索引前缀:本文实例的全部索引形如 1e4a_users、1e4a_goals(_cat/indices 实录见《安装部署指南》第七节)。改它必须紧跟一次全量重索引(MintCLI elasticsearch:reindex,见 CLI 篇),否则列表与全局搜索指向一套不存在的空索引。验证实录见第九节实录 3。

2.6 cron 段(第 96~100 行)

'cron' => array (
    'max_cron_jobs' => 10,       // 单轮 cron.php 最多执行作业数
    'max_cron_runtime' => 30,    // 单轮最长运行秒数
    'min_cron_interval' => 30,   // 相邻两轮最小间隔秒数
    'max_repeat_count' => 1000,  // 日历重复事件最多生成次数
),

配合每分钟一次的系统 crontab(部署篇第九节):单轮最多处理 10 个作业、跑满 30 秒让位,防止长任务阻塞调度。实测连续两次手动运行 cron.php 会得到 FATAL Job runs too frequently, throttled to protect the system.——即 min_cron_interval 的保护在起作用。

2.7 安全与集成段

参数实测默认值语义
oauth2_encryption_key(322 行)44 字符 Base64(安装时生成)OAuth2 令牌/客户端凭据加密密钥;丢失 = 全部已发令牌失效,备份必须包含
passwordsetting(323 行起)安装器默认密码策略(长度、过期、找回方式)
OAuth2 RSA 密钥/var/www/minthcm/api/configs/private.key(1708 B)与 public.key(451 B)安装器 writing RSA key 产物,JWT 签名用;私钥权限应仅 www-data 可读

2.8 目录段

参数实测默认值语义
upload_dir(486 行)upload/(相对 legacy/)全部上传附件落盘处,备份必含
cache_dir(76 行)cache/模板/元数据缓存,可整体清空重建
tmp_dir(458 行)cache/xml/导入导出临时目录
session_dir(394 行)''(空 = PHP 默认 /var/lib/php/sessions)会话存储,多机部署时改用 Redis/共享存储才需要动

三、api 层配置:api/configs/mint/config.php

新版 REST API(Vue 前端走 /api/*)有独立配置 $mint_config,发行包模板即生效值:

$mint_config = array(
    "search" => array(
        "default_engine" => 'ElasticSearch',
        "default_page_size" => 25,               // api 列表默认页大小
        "engines" => array( "ElasticSearch" => array(
            array('host' => 'localhost', 'user' => '', 'pass' => '', 'port' => '9200'),
        )),
    ),
    "database" => array('driver' => 'pdo_mysql', 'host' => "localhost", 'port' => '3306',
        'dbname' => '', 'user' => '', 'password' => '', 'charset' => 'utf8mb4'),
    'oauth2_encryption_key' => 'MintHCM-DEFKEY',
    'session_grant_interval' => 'PT4H',          // 会话授权间隔(ISO 8601 时长)
);

要点:database 的库名/口令留空属正常——api 通过 legacy 连接器复用 config.php 的数据库段,不需要在此重复填写;ES 走无认证 7.x 时 user/pass 留空即可;session_grant_interval 为 ISO 8601 时长(PT4H = 4 小时)。同目录 configs/private.key|public.key 即 2.7 节的 RSA 密钥对。

四、PHP 运行层:php.ini 上传链

默认 Debian 的 upload_max_filesize = 2M、post_max_size = 8M(实测文件 /etc/php/8.2/apache2/php.ini 第 855、703 行),对附件密集的 HR 场景明显不够。改为 20M/25M 后重启:

sed -i 's/^upload_max_filesize = 2M$/upload_max_filesize = 20M/; s/^post_max_size = 8M$/post_max_size = 25M/' /etc/php/8.2/apache2/php.ini
systemctl restart apache2

验证(读取 Apache 模块所用的 ini):

$ php -c /etc/php/8.2/apache2 -i | grep -E '^(upload_max_filesize|post_max_size)'
post_max_size => 25M => 25M
upload_max_filesize => 20M => 20M

三个值要成链:upload_max_filesize ≤ post_max_size ≤ Apache LimitRequestBody(默认 0 不限)。memory_limit 同理需 ≥ post_max_size。

五、.htaccess 安全响应头(4.3.5 新增)

4.3.5 起根目录 .htaccess 为 SPA 增加了完整安全头(<Files "index.html"> 段),实测对 / 与 /vue/dist/index.html 均生效:

$ curl -sI http://localhost:8147/ | grep -iE 'content-security|x-frame|x-content-type|referrer'
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://www.google.com https://www.gstatic.com; style-src 'self' 'unsafe-inline' https://cdn.materialdesignicons.com https://cdn.jsdelivr.net https://fonts.googleapis.com https://www.gstatic.com; img-src 'self' data: blob:; font-src 'self' data: https://cdn.materialdesignicons.com https://cdn.jsdelivr.net https://fonts.gstatic.com; connect-src 'self' https://cdn.jsdelivr.net; frame-src 'self' https:; frame-ancestors 'self'; object-src 'none'; base-uri 'self'; form-action 'self'
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Referrer-Policy: strict-origin-when-cross-origin

如需接入 CDN 或第三方字体,要同步扩 script-src/style-src/font-src/connect-src 白名单——这些指令与 legacy/include/utils.php 中 get_default_csp_directives() 保持同步(官方注释原话)。

六、参数生效性验证实录

以下 6 组均为本文实测机的"改动 → 观察 → 恢复"完整记录。

实录 1:list_max_entries_per_page(列表页大小,改完即时生效,无需任何重启)

$ grep -n "list_max_entries_per_page" legacy/config.php
287:  'list_max_entries_per_page' => 20,
$ # 默认 20:登录 admin 后拉取 Users 列表,数表格行(odd/evenListRowS1 类)
$ grep -c 'oddListRowS1\|evenListRowS1' users20.html
19
$ sed -i "s/'list_max_entries_per_page' => 20,/'list_max_entries_per_page' => 5,/" legacy/config.php
$ # 同一会话重新拉取 Users 列表
$ grep -c 'oddListRowS1\|evenListRowS1' users5.html
5

19 ≈ 20(首页行因分页起始标记略少 1),改 5 后精确 5 行——参数直通渲染层。

实录 2:logger.level(fatal → debug)

$ # 级别 fatal:清空日志跑一轮 cron.php
$ grep -c 'DEBUG' minthcm.log
0
$ sed -i "s/'level' => 'fatal',/'level' => 'debug',/" legacy/config.php
$ # 清空日志再跑一轮
$ grep -c 'DEBUG' minthcm.log
38
$ head -2 minthcm.log
Wed Oct 28 13:35:54 2026 [1921][-none-][DEBUG] current_language is: en_us
Wed Oct 28 13:35:54 2026 [1921][-none-][DEBUG] Found cache backend SugarCacheAPC

生产常年保持 fatal,排障时临时改 debug。

实录 3:elasticsearch_index_prefix(索引命名根参数)

$ sed -i "s/'elasticsearch_index_prefix' => '1e4a',/'elasticsearch_index_prefix' => 'c1test',/" legacy/config.php
$ printf 'Users\n' | sudo -u www-data ./MintCLI elasticsearch:reindexModule
Reindexing ElasticSearch
$ curl -s 'localhost:9200/_cat/indices/c1test*?v'
health status index        uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   c1test_users lbDsWo0HQ7mubptpizx21w   1   1          0            0       227b           227b

前缀一改,新索引即刻按新前缀命名。恢复 1e4a 并重索引后 1e4a_users 回到 69 条文档——该参数决定索引命名空间,改前缀 = 换一套索引,务必跟重索引。

实录 4:config_override.php 覆盖层

$ printf '<?php\n$sugar_config["list_max_entries_per_page"] = 7;\n' > legacy/config_override.php
$ # 重新拉取 Users 列表
$ grep -c 'oddListRowS1\|evenListRowS1' users7.html
7
$ rm legacy/config_override.php
$ # 再拉取
$ grep -c 'oddListRowS1\|evenListRowS1' usersr.html
19

覆盖层压过主配置同名键,删除即还原——升级安全的正确用法:自己的改动全写 override,config.php 交给安装器/升级器。

实录 5:php.ini 上传链(见第四节,2M/8M → 20M/25M,systemctl restart apache2 后经 Apache 侧 ini 读出)

实录 6:CSP 安全头(见第五节,4.3.5 默认即带,四头齐全)

七、生产建议速查

目标改哪里
换域名/端口config.php 的 site_url + host_name,再核对 .htaccess RewriteBase(部署篇排障实录 1)
上传大附件php.ini 三值成链(第四节)
查不到数据/搜索空logger.level=debug + dbconfigoption.debug=1 双开,看 minthcm.log;确认 cron 在跑、elasticsearch_index_prefix 未动过
数据库慢dbconfigoption.persistent=true 保持;跨机时开 ssl
升级版本自定义参数进 config_override.php(实录 4),./MintCLI upgrade 前先跑 instance:rebuild(见 CLI 篇)

参考来源(查询日期 2026-10-28)

  1. 实测环境:/var/www/minthcm/legacy/config.php(4.3.5 安装器生成,511 行)、api/configs/mint/config.php、.htaccess、/etc/php/8.2/apache2/php.ini
  2. 官方安装指南(crontab 与 AllowOverride 要求):https://minthcm.org/support/minthcm-installation-guide/
  3. 官方 System Configuration Wiki:https://wiki.minthcm.org/index.php?title=Process:System_configuration
  4. Releases v4.3.5 安全更新说明(CSP/SSO):https://github.com/minthcm/minthcm/releases