2、将文件放在不同的主机上,提供不同的镜像供用户下载,这样一来就可以把几种的流量分散到各台服务器上,减轻主服务器压力,另外访问流量大对服务器带宽和流量也是一个很大的考验,因此,大流量站点需要尽可能的选择大带宽不限流量美国服务器 。
1.首先还是查看环境是否支持超大容量上传的支持,500M以上的文件通常为视频文件;2.即然他要上传500M以上的文件,估计服务器性能必定非同凡想,所以暂可不考虑服务器硬件配置问题,但一定要考虑到网速问题,建议1000M以上出入速率,如少于这个数,你可以放弃这个方案了;
3.前面硬件都过关了,但程序也要加强了,一下上传500M是哪种语言都不能实现的,唯一解决方案,文件切割,如迅雷下载原理一样(采用续点上传),分成若干小块,然后全部上传完毕以后,再进行文件合成。
4.至于PHP的文件切割,切割后上传,以及文件合并,此类代码网上有许多,楼主可查询并选择适合你的代码,实现你的功能!
/*** 发送文件
*
* @author: legend(legendsky@hotmail.com)
* @link: http://www.ugia.cn/?p=109
* @description: send file to client
* @version: 1.0
*
* @param string $fileName 文件名称或路径
* @param string $fancyName 自定义的文件名,为空则使用filename
* @param boolean $forceDownload 是否强制下载
* @param integer $speedLimit速度限制,单位为字节,0为不限制,不支持windows服务器
* @param string $$contentType 文件类型,默认为application/octet-stream
*
* @return boolean
*/
function sendFile($fileName, $fancyName = '', $forceDownload = true, $speedLimit = 0, $contentType = '')
{
if (!is_readable($fileName))
{
header("HTTP/1.1 404 Not Found")
return false
}
$fileStat = stat($fileName)
$lastModified = $fileStat['mtime']
$md5 = md5($fileStat['mtime'] .'='. $fileStat['ino'] .'='. $fileStat['size'])
$etag = '"' . $md5 . '-' . crc32($md5) . '"'
header('Last-Modified: ' . gmdate("D, d M Y H:i:s", $lastModified) . ' GMT')
header("ETag: $etag")
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) &&strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lastModified)
{
header("HTTP/1.1 304 Not Modified")
return true
}
if (isset($_SERVER['HTTP_IF_UNMODIFIED_SINCE']) &&strtotime($_SERVER['HTTP_IF_UNMODIFIED_SINCE']) <$lastModified)
{
header("HTTP/1.1 304 Not Modified")
return true
}
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag)
{
header("HTTP/1.1 304 Not Modified")
return true
}
if ($fancyName == '')
{
$fancyName = basename($fileName)
}
if ($contentType == '')
{
$contentType = 'application/octet-stream'
}
$fileSize = $fileStat['size']
$contentLength = $fileSize
$isPartial = false
if (isset($_SERVER['HTTP_RANGE']))
{
if (preg_match('/^bytes=(d*)-(d*)$/', $_SERVER['HTTP_RANGE'], $matches))
{
$startPos = $matches[1]
$endPos = $matches[2]
if ($startPos == '' &&$endPos == '')
{
return false
}
if ($startPos == '')
{
$startPos = $fileSize - $endPos
$endPos = $fileSize - 1
}
else if ($endPos == '')
{
$endPos = $fileSize - 1
}
$startPos = $startPos <0 ? 0 : $startPos
$endPos = $endPos >$fileSize - 1 ? $fileSize - 1 : $endPos
$length = $endPos - $startPos + 1
if ($length <0)
{
return false
}
$contentLength = $length
$isPartial = true
}
}
// send headers
if ($isPartial)
{
header('HTTP/1.1 206 Partial Content')
header("Content-Range: bytes $startPos-$endPos/$fileSize")
}
else
{
header("HTTP/1.1 200 OK")
$startPos = 0
$endPos = $contentLength - 1
}
header('Pragma: cache')
header('Cache-Control: public, must-revalidate, max-age=0')
header('Accept-Ranges: bytes')
header('Content-type: ' . $contentType)
header('Content-Length: ' . $contentLength)
if ($forceDownload)
{
header('Content-Disposition: attachmentfilename="' . rawurlencode($fancyName). '"')
}
header("Content-Transfer-Encoding: binary")
$bufferSize = 2048
if ($speedLimit != 0)
{
$packetTime = floor($bufferSize * 1000000 / $speedLimit)
}
$bytesSent = 0
$fp = fopen($fileName, "rb")
fseek($fp, $startPos)
//fpassthru($fp)
while ($bytesSent <$contentLength &&!feof($fp) &&connection_status() == 0 )
{
if ($speedLimit != 0)
{
list($usec, $sec) = explode(" ", microtime())
$outputTimeStart = ((float)$usec + (float)$sec)
}
$readBufferSize = $contentLength - $bytesSent <$bufferSize ? $contentLength - $bytesSent : $bufferSize
$buffer = fread($fp, $readBufferSize)
echo $buffer
ob_flush()
flush()
$bytesSent += $readBufferSize
if ($speedLimit != 0)
{
list($usec, $sec) = explode(" ", microtime())
$outputTimeEnd = ((float)$usec + (float)$sec)
$useTime = ((float) $outputTimeEnd - (float) $outputTimeStart) * 1000000
$sleepTime = round($packetTime - $useTime)
if ($sleepTime >0)
{
usleep($sleepTime)
}
}
}
return true
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)