我使用两个php库来提供文件-unzip
和dUnzip2
zip zip.lib
http://www.zend.com/codex.php?id=470&单个=1
它们在10MB以下的文件上运行良好,但对于10MB以上的文件,我必须将内存限制设置为256。对于超过25MB的文件,我将其设置为512。它看起来有点高。。。是吗?
我在一个专用服务器上——4个CPU和16GB RAM——但我们也有很多流量和下载,所以我有点想知道这里。
也许您正在使用php将整个文件加载到内存中,然后再将其提供给用户?我使用了在中找到的函数http://www.php.net/manual/en/function.readfile.php(注释部分)将文件分成若干部分,以保持较低的内存。从那篇文章复制(因为我的版本已经更改):
<?php
function readfile_chunked ($filename,$type='array') {
$chunk_array=array();
$chunksize = 1*(1024*1024); // how many bytes per chunk
$buffer = '';
$handle = fopen($filename, 'rb');
if ($handle === false) {
return false;
}
while (!feof($handle)) {
switch($type)
{
case'array':
// Returns Lines Array like file()
$lines[] = fgets($handle, $chunksize);
break;
case'string':
// Returns Lines String like file_get_contents()
$lines = fread($handle, $chunksize);
break;
}
}
fclose($handle);
return $lines;
}
?>
我的脚本是在用户下载之前授权文件
一般来说,您应该避免使用任何消耗那么多内存或CPU时间的web脚本。理想情况下,您应该通过分离的进程将任务转换为运行。设置一个高限制本身并不坏,但它会使检测写得不好的脚本变得更加困难,并且更容易对复杂页面的高需求影响甚至简单页面的性能。
例如,使用gearman,您可以轻松地设置一些在CLI上运行的许可证工作者脚本,并通过gearman API与它们进行通信。
这样,您的web服务器就可以自由执行低CPU和内存任务,并且您可以轻松地保证一次运行的授权任务永远不会超过X个(其中X是基于您允许运行的工作脚本数量)。
您的前端脚本可能只是一个AJAX小部件,用于轮询服务器,检查任务是否已完成。