PHP——在cron作业中从Amazon S3读取一个大的XML文件会导致进程内存不足


PHP - Reading in a large XML file from Amazon S3 in cron job causes process to run out of memory

我们有一个进程,设置在每天凌晨1点作为批处理作业运行,以执行一些我们需要的计算,以便向用户发送更新通知。

每次内核终止进程时,我们都会得到这样的消息:

Apr 8 01:06:51 martha kernel: [14697876.360797] Out of memory: Kill处理20803 (processDirector)得分347或牺牲孩子

操作系统(Ubuntu)似乎将内存转储到磁盘。该转储的内容是我们从S3读取的一个大XML文件。

奇怪的是,如果我只是在命令行中以。/processDirector的身份运行脚本,那么它确实执行成功了。

我们抓取的XML文件通常在40-70MB左右。我们使用Amazon S3 SDK2获取XML文件的代码如下:

$result = $s3->getObject(array(
    'Bucket' => 'updates-uk',
    'Key' => $key,
));
$body = $result->get('Body');
$body->rewind();
return $body->read($result['ContentLength']);

我想知道的是,如果这是一个问题与cron的配置,只允许一个进程使用一定数量的内存。

我使用PHP SAX XML解析器是为了提高速度,防止程序需要构建一个完整的SimpleXML对象或类似的东西。

关于如何解决这个问题,我有两个想法:

  1. 了解如何允许cron作业使用更多内存
  2. 将XML文件分阶段读入文件,并让SAX解析器从文件中解析,而不是在内存中保存完整的40-670MB XML字符串。

如果有人有任何想法如何解决这个问题,我将非常感谢。

可能只是PHP限制了脚本允许使用的内存大小:

要增加内存使用,命令ini_set()应该可以帮助您。下面是一篇关于使用它来增加php脚本内存限制的文章。