我的托管服务提供商升级服务器(Debian)和PHP(从5.2.6到5.3.2)后,我的网站上的文件下载脚本出现问题。小于100MB的文件将下载正常,但文件大于100MB将仅下载为156字节文件...这是我的下载脚本:
class Download_Controller extends Website_Controller
{
public function index()
{
if (isset($_GET['file'])) {
$file = $_GET['file'];
$filORM = ORM::factory('file')->where('filename', $file)->find();
if ($filORM->loaded and $filORM->deleted=='N' and file_exists(APPPATH.'downloads/'.$file) ) {
//we can serve file download
$this->auto_render = false;
$filORM->counter = $filORM->counter + 1;
$filORM->save();
$dl = ORM::factory('download');
$dl->download_file_id = $filORM->id;
$dl->created = time();
$dl->country_id = $this->country->id;
$dl->ip = $this->_getRealIpAddr();
$dl->browser = Kohana::user_agent('browser');
$dl->version = Kohana::user_agent('version');
$dl->platform = Kohana::user_agent('platform');
$dl->save();
return download::force(APPPATH.'downloads/'.$file);
}
else {
$this->download_error();
}
}
else {
//else here we load download center UI
$this->section();
}
}
}
我正在使用Kohana PHP框架。版本2.3.x。
答案 0 :(得分:2)
在评论中,你给了我示例链接,我试了一个,我下载的那个156字节的文件包含了这个:
致命错误:第93行的/home/www-data/system/helpers/download.php中允许的内存大小为134217728字节(试图分配141637633字节)
很明显 - PHP内存不足。我认为升级时他们也改变了php.ini中的memory_limit。短期解决方案是将其更改为原始(更高)值。
对于下载大文件,您应该查看mod_xsendfile(也可用于apache以外的服务器),这涉及设置一个特殊的http标头,并将工作留给Web服务器而不是php。
答案 1 :(得分:0)
如果Kohana的download::force()
的工作方式与其他任何框架的工作方式相同 - PHP根本不能或不允许在内存中保存超过100MB的数据。
答案 2 :(得分:0)
我不知道download::force()
的代码是什么,但我认为它会将整个文件加载到内存中,PHP会停止执行,如Allowed memory size is exhausted
这样的错误。您需要通过小块加载和输出文件,检查客户端是否中止连接。
<强>更新强>
您的文件包含Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 141637633 bytes) in /home/www-data/system/helpers/download.php on line 93
。所以,正如我所写的那样,用小块输出它。
答案 3 :(得分:0)
您可以在没有readfile(APPPATH.'downloads/'.$file)
的情况下直接尝试exit()
然后return
,然后您将不再受内存问题的限制