我正在尝试为用户提供大型zip文件。当有2个并发连接时,服务器的内存(RAM)将用完。我将内存量从300MB增加到4GB(Dreamhost VPS),然后它工作得很好。
我需要允许2个以上的并发连接。实际的4GB将允许大约20个并发连接(太糟糕了)。
嗯,我现在使用的代码,需要双倍的内存,然后是实际文件大小。那太糟糕了。我想要一些类似于将文件“流式传输”给用户的东西。因此,我只会将提供给用户的数据块分配给用户。
以下代码是我在CodeIgniter(PHP框架)中使用的代码:
ini_set( memory_limit , 300M ); // it was the maximum amount of memory from my server
set_time_limit(0); // to avoid the connection being terminated by the server when serving bad connection downloads
force_download("download.zip", file_get_contents("../downloads/big_file_80M.zip"));exit;
force_download函数如下(CodeIgniter默认辅助函数):
function force_download($filename = , $data = )
{
if ($filename == OR $data == )
{
return FALSE;
}
// Try to determine if the filename includes a file extension.
// We need it in order to set the MIME type
if (FALSE === strpos($filename, . ))
{
return FALSE;
}
// Grab the file extension
$x = explode( . , $filename);
$extension = end($x);
// Load the mime types
@include(APPPATH. config/mimes .EXT);
// Set a default mime if we can t find it
if ( ! isset($mimes[$extension]))
{
$mime = application/octet-stream ;
}
else
{
$mime = (is_array($mimes[$extension])) ? $mimes[$extension][0] : $mimes[$extension];
}
// Generate the server headers
if (strpos($_SERVER[ HTTP_USER_AGENT ], "MSIE") !== FALSE)
{
header( Content-Type: " .$mime. " );
header( Content-Disposition: attachment; filename=" .$filename. " );
header( Expires: 0 );
header( Cache-Control: must-revalidate, post-check=0, pre-check=0 );
header("Content-Transfer-Encoding: binary");
header( Pragma: public );
header("Content-Length: ".strlen($data));
}
else
{
header( Content-Type: " .$mime. " );
header( Content-Disposition: attachment; filename=" .$filename. " );
header("Content-Transfer-Encoding: binary");
header( Expires: 0 );
header( Pragma: no-cache );
header("Content-Length: ".strlen($data));
}
exit($data);
}
我尝试了一些在谷歌上找到的基于区块的代码,但文件总是被破坏了。可能是因为代码不正确。
有人能帮我吗?