尚未达到PHP内存限制,但OOM杀手杀死了php脚本

时间:2019-05-08 06:26:46

标签: php

我正在执行长时间运行的php脚本(PHP 7.3),该脚本以循环方式解析XML,并将数据添加到MySQL。我在脚本中使用ini_set('memory_limit', '512M')将内存限制设置为512MB。问题是,在解析了xml的OOM杀手的大约一半后,错误地杀死了php:

  

[2019年5月6日星期一16:52:09]内存不足:杀死进程12103(php)得分704或牺牲孩子
  [2019年5月6日16:52:09]杀死进程12103(php)total-vm:12540924kB,anon-rss:12268740kB,file-rss:3408kB,shmem-rss:0kB

我尝试使用memory_get_usage和php_meminfo调试代码。它们都表明脚本在每个循环的开始和结束时不超过100MB的内存(xml的大小相同)。我已经在每个循环结束时取消设置所有可能的var。

尽管脚本中有0.5GB的内存限制,但PHP似乎仍使用了12.5GB的RAM。我期望PHP如果达到内存限制但永远不会发生,则会引发致命的memory exhausted错误。

有什么想法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

我已经工作过导入大型xml文件,并且需要大多数人期望的更多内存。正如@NigelRen所建议的,不仅是文件的内存使用,而且是相关的变量和过程,处理大型xml的最佳方法是分批读取文件。这是一个简单的示例,我希望可以为您提供有关如何执行此操作的想法。

console.log