怎么优化php因为下载导致负载过大

怎么优化php因为下载导致负载过大,第1张

1、大文件的下载会占用很大的流量,并且对于非SCSI硬盘来说,大量文件下载会消耗CPU,使得网站响应能力下降。因此,尽量不要提供超过2M的大文件下载,如果需要提供,建议将大文件放在另外一台服务器上。

2、将文件放在不同的主机上,提供不同的镜像供用户下载,这样一来就可以把几种的流量分散到各台服务器上,减轻主服务器压力,另外访问流量大对服务器带宽和流量也是一个很大的考验,因此,大流量站点需要尽可能的选择大带宽不限流量美国服务器 。

1.首先还是查看环境是否支持超大容量上传的支持,500M以上的文件通常为视频文件;

2.即然他要上传500M以上的文件,估计服务器性能必定非同凡想,所以暂可不考虑服务器硬件配置问题,但一定要考虑到网速问题,建议1000M以上出入速率,如少于这个数,你可以放弃这个方案了;

3.前面硬件都过关了,但程序也要加强了,一下上传500M是哪种语言都不能实现的,唯一解决方案,文件切割,如迅雷下载原理一样(采用续点上传),分成若干小块,然后全部上传完毕以后,再进行文件合成。

4.至于PHP的文件切割,切割后上传,以及文件合并,此类代码网上有许多,楼主可查询并选择适合你的代码,实现你的功能!

/**

* 发送文件

*

* @author: legend([email protected])

* @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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/6072062.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-13
下一篇 2023-03-13

发表评论

登录后才能评论

评论列表(0条)

保存