Limit Download Speed With PHP

http://code.google.com/p/phptraining/source/browse/trunk/download_limited.php

class DownloadLimited
{
 /**
 * Send the local file to client with limit download rate as user view file name
 *
 * @param string $localFile file to send
 * @param string $userViewFileName filename client will see
 * @param float $downloadRate download limit speed in kb/s (ex: 50 kb/s)
 * @return no return
 */
 function sendFile($localFile,$userViewFileName,$downloadRate)
 {
 /** check file exists
 * @see file_exists
 */
 if(!file_exists($localFile))
 {
 throw new Exception('File not found execption file :'.$localFile.' not found');
}
/** check file is file
* @see is_file
*/
if(!is_file($localFile))
{
 throw new Exception($localFile.' not is a file');
}
if(!is_readable($localFile))
{
 throw new Exception('file '.$localFile.' not readable ');
}
// send headers
header('Cache-control: private');
header('Content-Type: application/octet-stream');
header('Content-Length: '.filesize($localFile));
header('Content-Disposition: filename='.$userViewFileName);

// flush header content
flush();
// open file stream
$file = fopen($localFile, "r");
while(!feof($file))
{

 // send the current file part to the browser
 print fread($file, round($downloadRate * 1024));

 // !important flush the content to the browser
 flush();

 // !important sleep one second
 sleep(1);
}

// close file stream
fclose($file);


}
/**
* Send the string data to client with limit download rate as user view file name
*
* @param string string data to send include ascii,utf-8 character
* @param string $userViewFileName filename client will see
* @param float $downloadRate download limit speed in kb/s (ex: 50 kb/s)
* @return no return
*/
function sendString($data,$userViewFileName,$downloadRate)
{
 // send headers
 header('Cache-control: private');
 header('Content-Type: application/octet-stream');
 header('Content-Length: '.strlen($data));
 header('Content-Disposition: filename='.$userViewFileName);
 // flush header content
 flush();

 $start=0;
 $sendSize=0;
 while($sendSize {
 $sendSize=round($downloadRate*1024);
 print substr($data,$start,$sendSize);
 $start=$sendSize;
 // !important flush the content to the browser
 flush();

 // !important sleep one second
 sleep(1);
}
}
}

Leave a Reply

Your email address will not be published. Required fields are marked *