hocon不是php原生支持的格式,必须通过jvm工具config-cli将.conf转为json后,再用json_decode()解析为php数组;禁用parse_ini_file等无效方法,生产环境建议改用php、json或yaml等原生兼容格式。

HOCON不是PHP原生支持的格式,必须转成JSON或数组再处理
PHP标准库完全不识别.conf或HOCON语法(比如foo = ${bar}、省略逗号、多行字符串),直接file_get_contents()读出来只是原始文本,没法当配置用。你得先用外部工具把HOCON解析成PHP能操作的数据结构。
目前最靠谱的方案是调用JVM工具链:HOCON官方参考实现是Lightbend的config库,它提供命令行工具config-cli(基于Java),可将HOCON转为JSON。PHP只需执行shell命令拿到JSON输出,再json_decode()即可。
- 确保系统已安装JRE(至少Java 8)
- 下载
config-cli.jar(从Maven中央库找最新版,如config-1.4.3.jar) - 别用PHP的
parse_ini_file()或yaml_parse_file()——它们对HOCON完全无效,会静默失败或报JSON decode error
用shell_exec安全转换HOCON到PHP数组
核心思路是:PHP调用java -jar config-cli.jar把HOCON文件转成JSON字符串,再解码。注意路径、空格、错误捕获——这步最容易因权限或路径出问题。
示例代码片段:
$hoconPath = '/path/to/app.conf';
$jarPath = '/path/to/config-1.4.3.jar';
// 构造命令(必须加 -Dconfig.file= 并用引号包裹路径,防空格)
$cmd = sprintf('java -Dconfig.file="%s" -jar "%s" --format json 2>&1', $hoconPath, $jarPath);
$output = shell_exec($cmd);
// 检查是否返回有效JSON(config-cli出错时会输出Java堆栈,不是JSON)
if (empty($output) || !str_starts_with(trim($output), '{')) {
throw new RuntimeException('HOCON parse failed: ' . trim($output));
}
$config = json_decode($output, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException('Invalid JSON from config-cli: ' . json_last_error_msg());
}
- 务必用
2>&1合并stderr,否则Java异常会被丢弃,PHP以为执行成功 -
shell_exec()在生产环境常被禁用(disable_functions含该函数),需确认PHP配置 - 不要拼接用户输入进
$cmd——HOCON路径必须是白名单内绝对路径,避免命令注入
写回HOCON只能靠生成文本,没有标准序列化方法
HOCON没有规范的“反向生成”逻辑:${db.host}这种引用、注释位置、缩进风格、单引号/双引号选择,都无法从PHP数组无损还原。所谓“写配置”,实际是生成一个语义等价但格式可能不同的HOCON文本。
可行做法只有两种:
- 用PHP模板拼接(适合结构固定、变量少的场景),例如:
"db {\n host = \"{$config['db']['host']}\"\n}" - 先转成JSON,再用
config-cli的--format hocon(部分版本支持,但输出不可控,且不保留注释和原始格式)
重点:任何自动生成的HOCON都**不能保证与原始文件格式一致**,CI/CD中若校验文件diff会失败;生产环境建议只读不写,修改走运维流程或独立配置管理平台。
替代方案:改用PHP原生兼容的格式更省事
如果项目可控,强烈建议放弃HOCON。PHP生态里.php返回数组、.json、.yaml(配合symfony/yaml)都开箱即用,无依赖、无进程调用、无编码陷阱。
-
include 'config.php';—— 最快,支持PHP表达式(如$_ENV['DB_HOST'] ?? 'localhost') -
json_decode(file_get_contents('config.json'), true)—— 标准、跨语言、易校验 - YAML需装扩展或composer包,但比HOCON的Java依赖轻量得多
HOCON的价值在于JVM生态的配置继承与覆盖能力(include、withFallback),PHP项目硬套这套模型,反而把简单问题复杂化——尤其是当你的部署环境连Java都没有的时候。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











