使用 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 耗尽内存的主要内容,如果未能解决你的问题,请参考以下文章