2012-01-02 76 views
0

我尝试使用下面的代码,允许从我的网站下载:PHP打印(FREAD(...))内存不足错误

while(!feof($file)) { 
    print(fread($file, 1024*8)); 
    flush(); 
    if (connection_status()!=0) { 
     @fclose($file); 
     die(); 
    } 
} 
@fclose($file); 

已下20MB的文件工作的伟大,但我最近提供了一个大约150MB的文件,并很快发现正在下载不超过80MB的文件。经过大量的研究,我发现内存不足的错误的不完整的文件的最后几行:

致命错误:内存(分配82313216)(试图 分配81530881个字节)

我的理解是print(fread(...))从文件中分配并读取(1024 * 8)字节,通过打印转储它们,然后使用相同的8192字节读取/转储下一部分文件。

显然我有什么问题,谁能帮我理解这里发生了什么?以及该问题的任何可能的解决方法?谢谢!

更新:该错误消息是指线302,其是:

while(!feof($file)) 

此外,浏览器适当地显示进度条,所以我知道正在正确地发送的文件大小。

+0

为什么你不使用'ReadFile的()'(http://php.net/readfile)(作为一个旁注:它通常是一个坏主意,通过静态内容通过PHP只是因为它可能)。它提到“试图分配[〜80MB]”。你确定,这是真正的代码,导致错误? – KingCrunch 2012-01-02 19:17:51

+0

错误信息通常应该指出确切的线......: - ? – 2012-01-02 19:22:37

+3

你使用outbut缓冲?即使通过尝试将其输出到小块中,仍然会将整个文件吸收到内存中。 – 2012-01-02 19:23:07

回答

0

请检查:

if ($file!=false){ 
     while(!feof($file)) { 
     print(fread($file, 1024*8)); 
     flush(); 
     if (connection_status()!=0) { 
      @fclose($file); 
      die(); 
     } 
     } 
     @fclose($file); 
    }