Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php fpasstrhu中已耗尽的允许内存大小_Php_Memory - Fatal编程技术网

Php fpasstrhu中已耗尽的允许内存大小

Php fpasstrhu中已耗尽的允许内存大小,php,memory,Php,Memory,在PHP中,有没有一种方法可以在不超过内存的情况下将一个大文件(大约>700mb)发送到浏览器 我试过使用fpassthru和readfile,但它超出了内存限制。Good old fopen()+fread()+fclose(): 听起来您使用的问题是由于整个文件都被加载到内存中。相反,您应该使用传统的//循环将文件数据分块读取,并在运行时输出数据 例如: <?php $fileRes = fopen('/path/to/your/file.data', 'rb'); i

在PHP中,有没有一种方法可以在不超过内存的情况下将一个大文件(大约>700mb)发送到浏览器


我试过使用
fpassthru
readfile
,但它超出了内存限制。

Good old fopen()+fread()+fclose():

听起来您使用的问题是由于整个文件都被加载到内存中。相反,您应该使用传统的//循环将文件数据分块读取,并在运行时输出数据

例如:

<?php
    $fileRes = fopen('/path/to/your/file.data', 'rb');
    if(is_resource($fileRes) {
        while (!feof($fileRes)) {
            echo fread($fileRes);
        }
        fclose($fileRes);
    }
    else die("Couldn't open file...");
?>

如果您的Web服务器支持,最有效的解决方案是使用X-Sendfile头

这意味着您根本不需要占用PHP来提供文件,只需发送头并让web服务器处理即可

示例(来自Apache modxsendfile页面:)

fpassthru
(如
readfile
)直接发送数据,无需分配太多内存。 因此,缓存和
ob_end_flush
中的问题将有助于:

<?php

$fp = fopen($filename, 'rb');

header('Content-Type: ' . mime_type($filename));
header("Content-Length: " . filesize($filename));

ob_end_flush()

fpassthru($fp);
exit;

<代码>可能的重复:@阿贝尔,我不认为它们是重复的-那些有不同的原因占用了所有的内存。你使用什么版本的PHP(在什么平台上)?还有,为什么你认为它的内存不足?(如果正在生成特定错误,请发布代码示例和精确错误。)@Dave Vogt:好的,谢谢你指出这一点。我将把它们留在内存中,因为它们至少是相似的:文件通过internet浏览器发送到服务器。
fpassthru
readfile
除非有足够的空间,否则不要将整个文件读取到内存中,这段代码与PHP的功能基本相同,只是效率较低。@Long认为这似乎有点奇怪。也就是说,OP可能使用了一些旧版本的PHP,尽管即使如此,如果存在这样的问题,我也会感到惊讶。仅供参考,我可以通过
readfile
提供一个700MB的文件,内存限制为8MB。您链接到的fpassthru页面上的一条注释表明PHP 4中存在内存泄漏,很可能就是这样。请确保您没有使用输出缓冲-通常,当我们看到readfile()消耗内存时,这是因为用户正在使用输出缓冲,导致PHP缓冲readfile()。+1冷解决方案。必须承认,我以前从未遇到过这种情况,但这似乎是最有效的方法。+1-X-Sendfile是解决这个问题的一个很好的方法,它没有足够的压力。我将尝试一下。让服务器来完成这项工作听起来是合乎逻辑的,而不是两者都可以。不幸的是,在Apache上需要一个不推荐使用的、非标准的
modxsendfile
header("X-Sendfile: $path_to_somefile");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$somefile\"");
exit;
<?php

$fp = fopen($filename, 'rb');

header('Content-Type: ' . mime_type($filename));
header("Content-Length: " . filesize($filename));

ob_end_flush()

fpassthru($fp);
exit;