【发布时间】:2017-07-26 14:43:58
【问题描述】:
所以,我有一个大的 JSON 文件,我想将该文件中的数据插入 MySQL 数据库。我只能使用 PHP 5.6,不能更改 php.ini 文件。
当我使用json_decode() 时,我得到错误,有太多的内存要分配。所以我搜索了某种库,发现了这个library,我就这样使用它:
set_time_limit(300);
$listener = new \JsonStreamingParser\Listener\InMemoryListener();
$stream = fopen('data/stops.json', 'r');
try {
$parser = new \JsonStreamingParser\Parser($stream, $listener);
$parser->parse();
fclose($stream);
} catch (Exception $e) {
fclose($stream);
throw $e;
}
var_dump($listener->getJson());
但我仍然收到关于记忆的烦人错误:
致命错误:允许的内存大小为 134217728 字节已用尽(已尝试 分配 72 个字节)在 一些/PATH/TO/vendor/salsify/json-streaming-parser/src/Parser.php on 第 516 行
我不知道如何获取我的 JSON 文件。因此,我正在寻找一些建议,或者可以帮助我编写负责将 JSON 文件转换为数组的代码的人,因此我将该数组中的数据插入到数据库中。此外,我不是在寻找一次性解决方案,因为我需要每天至少解析一个 JSON。
这是整个 JSON 文件:JSON,结构如下:
{
"2017-07-26":
{
"lastUpdate":"2017-07-26 07:07:01",
"stops":[
{
"stopId":32640,
"stopCode":null,
"stopName":null,
"stopShortName":"2640",
"stopDesc":"Amona",
"subName":"2640",
"date":"2017-07-26",
"stopLat":54.49961,
"stopLon":18.44532,
"zoneId":null,
"zoneName":null,
"stopUrl":"",
"locationType":null,
"parentStation":null,
"stopTimezone":"",
"wheelchairBoarding":null,
"virtual":null,
"nonpassenger":null,
"depot":null,
"ticketZoneBorder":null,
"onDemand":null,
"activationDate":"2017-07-25"
},
{...},
{...}
]
}
}
【问题讨论】:
-
这是单机吗?还是会经常发生这种情况?
-
您可以尝试使用带有
php_value memory_limit 200M的.htaccess文件(例如 200M)。我认为这取决于您的配置,但对我有用 -
定期,每天至少一次
-
是的,但是当我需要越来越多的内存来解析我的数组时,我正在寻找一些长远的解决方案,因为我不确定我的 JSON 文件将来会有多大而且我不想将这个限制设置为无限制或类似的东西
-
如果您的 JSON 文件是类似元素的重复结构,您可以修改您的脚本以能够处理多个文件,并拆分您的 JSON..