使用 php://input 耗尽内存

Posted

技术标签:

【中文标题】使用 php://input 耗尽内存【英文标题】:Memory exhausted using php://input 【发布时间】:2013-07-22 13:59:34 【问题描述】:

当使用 fopen("php://input") 上传一个 120MB 的文件时,我们会收到来自 php 的“内存耗尽”警告。 php memory_limit 设置为 256MB,我们有足够的可用内存。

我们删除了除 fopen("php://input") 之外的所有代码,但仍然失败,所以错误一定在里面。

我们尝试了不同的内存限制,在大约 500MB 时错误消失了。尽管如此,我们确实不应该使用 500MB,所以问题仍然存在:为什么在大小为 115-120MB 的文件上使用 fopen 会出现内存耗尽错误。

我们的 php 测试文件:

<?php
    $inputHandler = fopen('php://input', "r");
?>

还有错误:

262144000 bytes exhausted (tried to allocate 120829495 bytes)

我希望有人可以帮助我们。这让我们发疯了!

提前致谢!

【问题讨论】:

只有从 $inputHandler 读取时,您才应该在 fopen() 上收到该错误 您的 fopen 处理程序并不是唯一使用您的 PHP 内存的东西。在尝试将大文件加载到内存之前,请使用 memory_get_usage() 查看已使用的内存量。 @MarkBaker 这也是我们的想法,但这是唯一的代码行,它正在崩溃。当我们观察 httpd 进程时,我们可以看到上传文件时内存在增加,但从未超过 130MB。 @aynber 每个执行的 php 脚本都会得到 memory_limit 的解决。所以我使用的脚本应该有 256MB 可以使用 @MarkVisser 我有这个问题。你能解决这个问题吗? 【参考方案1】:

尝试配置为无限内存使用:

ini_set('memory_limit', '-1');

【讨论】:

没办法。我们不应该使用超过 256MB【参考方案2】:

这可能是因为 php 试图自动解析 POST 数据。 要禁用此功能,在 php 版本 5.4+ 中,您可以将 enable_post_data_reading 设置为 0。(我为此使用了 .htaccess) 但是,实际上,在 php 5.4+ 中,最好使用 $_FILES 进行上传...

【讨论】:

以上是关于使用 php://input 耗尽内存的主要内容,如果未能解决你的问题,请参考以下文章

为啥反复分配和释放内存会耗尽系统所有内存?

系统内存耗尽的案例分析

内存耗尽怎么办?

linux内存耗尽分析

内存耗尽后 Redis 会发生什么?

内存耗尽后Redis会发生什么 ?