如何从Web服务中将数据提取到数组中,然后在不耗尽内存限制的情况下存储在数据库中?

时间:2018-09-09 11:59:46

标签: php laravel

我正在尝试从Web服务中获取大量(类别)功能(数据)。要在Web服务上获取所有数据,需要花费很长时间(响应时间等等需要5个小时以上)。但是在第一个小时后,我收到“允许的134217728字节耗尽的内存大小”错误。

我在本地数据库中存储了类别。要获取类别的功能,我只需使用该类别的ID,服务就会向我返回该类别的功能。我可以将返回的数据立即存储到db中,但是只要整个过程完成,我将无法使用这些功能。

相反,我试图将所有结果数据存储到数组中,并且在整个循环结束之后,将所有数组存储到db中。这样一来,这些功能仅在写作过程中(大约5分钟)才会被阻止。

粗略地显示它:

foreach($categories as $category){
    $features = $webService->getCategoryFeatures($category->id);
    // ...and some other logics
}

foreach($features = $feature){
    App\Feature::create($feature);
    // ...and some other logics
}

大约有4000个类别。某些类别具有30000多个功能。因此,第一个序列需要相当长的时间。我只是将数据存储到数据库中的第二个序列只需要几分钟。

我需要一种可以临时存储返回的功能而不会出现内存错误的方法。此外,我不想增加限制。

任何想法都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

使Web服务通过输入页码返回有限的记录。用递增的页码调用Web服务,并将获得的结果存储在数据库中。再次呼叫下一个页码,直到您从页码中得到0结果。然后停止调用Web服务。

答案 1 :(得分:0)

实际上,我想出了一个简单的解决方案。我创建了一个临时(categoryies_temp)表,并使用此表开始了整个过程。因此,即使花费很长时间,原始表仍然可以运行。

该过程完成后,我首先将表截断,然后只需将所有临时记录复制到原始表中,只需几秒钟。我知道这似乎很简单,但肯定有效。