讲师中心 微信公众号
AI工具推荐 视频效率加速

php7.4文件管理实战:JSON配置文件的安全读写与解析【实战】

千敏同学_4059

千敏同学_4059

发布时间:2026-06-29 21:21:21

|

912人浏览过

|

来源于php中文网

原创

首选json_decode处理嵌套结构或需原生类型(如布尔、null、浮点)的配置,因其类型保真度高;parse_ini_file仅适用于扁平化简单配置,但默认全返回字符串易引发数值比较错误。

php7.4文件管理实战:json配置文件的安全读写与解析【实战】

parse_ini_file 和 json_decode 的选择依据

INI 适合简单配置(如开关、单层键值),JSON 更适合嵌套结构或需要数组/布尔原生类型的地方。PHP 7.4 对两者都完全兼容,但 json_decode 在类型保真度上更可靠——比如 true、null、大整数不会被转成字符串,而 parse_ini_file 默认全返回字符串,即使加 INI_SCANNER_TYPED 也对浮点和科学计数法支持有限。

常见错误现象:用 parse_ini_file 解析含 timeout = 30.5 的配置,结果是字符串 "30.5",后续做数值比较会出错;而 JSON 中的 "timeout": 30.5 经 json_decode($json, true) 后就是 float 类型。

  • 选 INI:仅用于环境标识、数据库连接串等扁平化配置,且团队习惯手写 ini 文件
  • 选 JSON:涉及权限树、API 路由映射、多级 credential 列表等结构,或需与前端共享同一份配置 schema
  • 别混用:同一项目中不要一部分用 INI、一部分用 JSON,维护成本陡增

json_decode 安全解析必须做的三件事

json_decode 看似一行调用,但跳过检查就等于把门敞给 malformed 数据。PHP 7.4 没改这个逻辑,错误仍静默返回 null,不抛异常。

  • 必须用 file_get_contents 读取后先校验是否失败:if (false === $raw) { throw new RuntimeException('Cannot read config.json'); }
  • 必须检查解码结果:if (null === $cfg && JSON_ERROR_NONE !== json_last_error()) { throw new InvalidArgumentException('Invalid JSON: ' . json_last_error_msg()); }
  • 必须限定深度:尤其当配置来自用户上传或第三方 API 时,加 512 参数防栈溢出(PHP 7.4 默认就是 512,但显式写出更稳妥)

示例片段:

立即学习“PHP免费学习笔记(深入)”;

$path = __DIR__ . '/config.json';
$raw = file_get_contents($path);
if (false === $raw) {
    throw new RuntimeException("Failed to read $path");
}
$cfg = json_decode($raw, true, 512, JSON_THROW_ON_ERROR);

注意:JSON_THROW_ON_ERROR 是 PHP 7.3+ 才有,PHP 7.4 可用,但它会让错误直接抛出异常,省去手动查 json_last_error() ——前提是你的错误处理机制能接住它。

Aria2 Json Rpc
Aria2 Json Rpc

通过 JSON‑RPC 2.0 与 aria2 下载管理器交互,使用自然语言命令管理下载、查询状态并控制任务。适用于 aria2、下载管理或种子操作。

下载

写入 JSON 配置文件时的权限与原子性陷阱

Nginx + PHP-FPM 环境下,file_put_contents('config.json', json_encode($data)) 表面没问题,实际极易出错:500 错误、空白页、配置被截断、并发写入损坏文件。

  • 路径必须绝对:__DIR__ . '/config.json',避免相对路径在 CLI / Web 下行为不一致
  • 权限要提前设好:确保 PHP 进程用户(如 www-data)对目录有写权限,文件本身建议 644,目录 755;别用 777
  • 必须原子写入:用 file_put_contents($path, $content, LOCK_EX) 加锁;更稳妥的是写临时文件再 rename(),因为 rename() 在同一文件系统下是原子操作
  • 编码要显式指定:json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT),否则中文变 \uXXXX,格式混乱难调试

典型安全写法:

$temp = tempnam(sys_get_temp_dir(), 'cfg_');
if (false === file_put_contents($temp, json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), LOCK_EX)) {
    unlink($temp);
    throw new RuntimeException('Failed to write temp config');
}
if (false === rename($temp, __DIR__ . '/config.json')) {
    unlink($temp);
    throw new RuntimeException('Failed to replace config.json');
}

PHP 7.4 特有坑:大整数精度丢失与 nullsafe 运算符误用

PHP 7.4 没修复 JSON 大整数问题——超过 PHP_INT_MAX(通常是 263−1)的数字会被转成 float,精度丢失。例如 ID 9223372036854775808 解码后变成 9.2233720368548E+18,再转回字符串就不是原值。

  • 解决方案:始终传 JSON_BIGINT_AS_STRING 给 json_decode,确保大整数进数组后仍是字符串
  • 别依赖 ?-> 做配置访问:比如 $cfg?->database?->host,但 $cfg 是数组而非对象——?-> 只对对象有效,数组要用 ?? 或 isset()
  • 类型声明没帮你兜底:即使函数参数写了 array $cfg,json_decode 返回 null 时也不会触发 TypeError,得靠前面的错误检查来拦截

真正安全的访问方式:

$host = $cfg['database']['host'] ?? 'localhost';
// 或更严谨
if (!isset($cfg['database']['host'])) {
    throw new InvalidArgumentException('Missing database.host in config');
}

复杂点在于:JSON 配置的“正确性”无法靠 PHP 类型系统静态保证,必须靠运行时校验 + 显式默认值兜底。没人会为 config 写完整 schema 验证,但至少该 check 的 key 一个都不能少。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

9524

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

5741

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2055

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

3588

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4274

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3351

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4757

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

3722

2023.11.13

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

0

2026.09.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn