最近接手了一个数据处理任务,需要从一个第三方服务导入大量数据。数据源是一个巨大的json文件,动辄几百mb甚至数gb,包含了成千上万条记录。一开始,我习惯性地使用了
json_decode
结果可想而知:程序刚运行几秒,就直接报错
Allowed memory size of X bytes exhausted
memory_limit
pcrov/jsonreader
正当我一筹莫展之际,我发现了
pcrov/jsonreader
XMLReader
pcrov/jsonreader
首先,通过Composer安装
pcrov/jsonreader
<pre class="brush:php;toolbar:false;">composer require pcrov/jsonreader
需要注意的是,它要求 PHP 7.3 或更高版本,并且需要开启
Intl
使用方法也非常直观。如果你用过
XMLReader
open()
read()
nodeType
name
value
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
假设我们有一个名为
large_users.json
<pre class="brush:php;toolbar:false;">[
{
"id": 1,
"name": "Alice",
"email": "alice@example.com",
"description": "A very long description for Alice..."
},
{
"id": 2,
"name": "Bob",
"email": "bob@example.com",
"description": "Another very long description for Bob..."
}
// ... 更多用户数据
]我们可以这样使用
pcrov/jsonreader
<pre class="brush:php;toolbar:false;"><?php
require 'vendor/autoload.php';
use pcrov\JsonReader\JsonReader;
$reader = new JsonReader();
try {
$reader->open('large_users.json');
// 移动到 JSON 文件的第一个节点 (通常是数组的开始)
$reader->read(); // nodeType: JsonReader::ARRAY
// 循环遍历数组中的每个对象
while ($reader->read()) {
if ($reader->nodeType === JsonReader::OBJECT) {
// 当前节点是一个对象 (例如:{"id": 1, ...})
$userData = [];
$reader->read(); // 移动到对象的第一个属性 (例如:"id")
// 循环读取当前对象的所有属性
while ($reader->nodeType !== JsonReader::END_OBJECT) {
$propertyName = $reader->name; // 获取属性名 (例如:"id")
$reader->read(); // 移动到属性值 (例如:1)
$propertyValue = $reader->value; // 获取属性值
$userData[$propertyName] = $propertyValue;
$reader->read(); // 移动到下一个属性或对象的结束
}
// 至此,$userData 包含了当前完整对象的属性和值
echo "处理用户: ID=" . $userData['id'] . ", 姓名=" . $userData['name'] . "\n";
// 在这里,你可以对 $userData 进行进一步处理,例如存储到数据库、进行数据转换等
// 关键在于,我们只在内存中维护了当前处理的单个对象,而不是整个文件!
}
}
} catch (\Exception $e) {
echo "处理JSON时发生错误: " . $e->getMessage() . "\n";
} finally {
$reader->close(); // 确保关闭文件句柄
}
?>引入
pcrov/jsonreader
pcrov/jsonreader
json_decode
总的来说,
pcrov/jsonreader
如果你也曾被大型JSON文件折磨,或者你的应用需要处理流式JSON数据,那么
pcrov/jsonreader
以上就是如何高效处理海量JSON数据?使用pcrov/jsonreader告别内存溢出!的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号