【问题标题】:How to insert large JSON file to database with PHP如何使用 PHP 将大型 JSON 文件插入数据库
【发布时间】: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..

标签: php json


【解决方案1】:

您需要通过ini_set 设置选项:http://php.net/manual/en/function.ini-set.php

ini_set('memory_limit','16M');

取自https://davidwalsh.name/increase-php-memory-limit-ini_set


或者,您可以使用 .htaccess 文件:

php_value memory_limit '512M'

感谢https://stackoverflow.com/a/42578190/351861

【讨论】:

  • 老实说,我有点惊讶,我有一些便宜的托管服务器,他们阻止我编辑 php.ini 文件,但 .htaccess 的技巧有效;但我仍然很好奇如何将我的 json 文件分块,并可能将其部分转换为 json_decode()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 2021-10-16
  • 2011-04-16
  • 1970-01-01
相关资源
最近更新 更多