php输入流大小限制

Posted

技术标签:

【中文标题】php输入流大小限制【英文标题】:php input stream size limitations 【发布时间】:2011-08-31 15:37:34 【问题描述】:

我正在尝试使用 php://input 从 php 读取原始输入流。这适用于大多数文件,但是上传时会忽略超过 4MB 的文件。我已将 post_max_size 和 upload_max_size 设置为 20M,每个都认为它可以解决我的问题,但事实并非如此。是否需要配置另一个 php.ini 设置,或者我是否需要进行某种分块?如果是这样,我将如何去做?这是upload.php代码:

$fileName = $_SERVER['HTTP_X_FILE_NAME'];
$contentLength = $_SERVER['CONTENT_LENGTH'];

file_put_contents('uploads/' . $fileName, file_get_contents("php://input"));

【问题讨论】:

仅供参考...我通过 xmlhttprequest 发送文件,通过 send 方法传递一个文件对象。 我想通了。 php 内存不足,无法将整个文件放入缓冲区,因此我使用 php.ini memory_limit 变量增加了内存限制。它有效,但它似乎不是最好的解决方案。如果有人知道如何将 php://input 流分段读取到文件中,这样它就不会耗尽内存限制,请告诉我!谢谢 【参考方案1】:

试试stream_copy_to_stream,它直接将输入的内容泵入文件中,而不是先将其全部复制到内存中:

$input = fopen('php://input', 'rb');
$file = fopen($filename, 'wb');
stream_copy_to_stream($input, $file);
fclose($input);
fclose($file);

替代方案:

$input = fopen('php://input', 'rb');
$file = fopen($filename, 'wb');
while (!feof($input)) 
    fwrite($file, fread($input, 102400));

fclose($input);
fclose($file);

【讨论】:

对不起,这不起作用,结果和以前一样。现在我可以上传更大文件的唯一方法是在 php.ini 文件中将 memory_limit 设置为更大的大小。出于某种原因,我什至不能用 ini_set("memory_limit", "64M"); 修改它 @srowley 这很奇怪。我通过从/dev/random 流复制数百 MB 进行了测试,内存使用量从未超过 7MB。根据手册页上的评论,stream_copy_to_stream 有时似乎行为不端。张贴“手动”替代品。如果这也没有帮助,那么您的问题出在其他地方。 我现在真的很困惑。您的第一种方法实际上适用于 672M 文件,但不适用于 5M 文件。我不知道为什么。 @deceze 当文件被流式传输到目的地时,是否可以使用来自不同php 文件的文件名读取已写入stream_copy_to_stream() 文件的字节数?

以上是关于php输入流大小限制的主要内容,如果未能解决你的问题,请参考以下文章

c# mvc文件上传大小限制maxrequestLength和maxAllowedContentLength的具体含义

PHP输入流php://input介绍

PHP输入流php://input介绍

张量流中的动态批量大小

PHP输入流

使用流分析读取时,事件中心输入大小数据的输出大小是输出大小的三倍