gpt4 book ai didi

php - 如何在不使用太多内存的情况下强制下载大文件?

转载 作者:可可西里 更新时间:2023-11-01 12:18:41 26 4
gpt4 key购买 nike

我正在尝试向用户提供大型 zip 文件。当有 2 个并发连接时,服务器会耗尽内存 (RAM)。我将内存量从 300MB 增加到 4GB (Dreamhost VPS),然后它运行良好。

我需要允许超过 2 个并发连接。实际的 4GB 将允许大约 20 个并发连接(太糟糕了)。

好吧,我正在使用的当前代码需要两倍于实际文件大小的内存。这太糟糕了。我想要类似于将文件“流式传输”给用户的东西。所以我只会分配给用户的 block 。

以下代码是我在 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);
}

我尝试了一些在 Google 中找到的基于 block 的代码,但文件总是在交付时损坏。可能是因为错误的代码。

谁能帮帮我?

最佳答案

this thread中有一些想法.我不知道 readfile() 方法是否会节省内存,但听起来很有希望。

关于php - 如何在不使用太多内存的情况下强制下载大文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6195550/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com