Hello, i'm saxtor i would like to know how to limit users bandwidth for 10gb per day however i dont want to limit them by ipaddress because if they where to go to an internet cafe the users at the cafe will be restricted with that quota, i need to log them via sockets, example the user request to download a file from http://localhost with there username and password, when they download the file sql will update there bandwidth they used, i have a script here but its not working my buffer doesnt work that rate when a user uses multiple connections thanks for the help!.
/**
* @author saxtor if you can improve this code email me @saxtorinc.com
* @copyright 2010
/
/*
* CREATE TABLE IF NOT EXISTS max_traffic (
id int(255) NOT NULL AUTO_INCREMENT,
limit int(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;
*/
//SQL Connection [this is hackable for testing]
date_default_timezone_set("America/Guyana");
mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("Quota") or die(mysql_error());
function quota($id)
{
$result = mysql_query("SELECT `limit` FROM max_traffic WHERE id='$id' ") or
die(error_log(mysql_error()));;
$row = mysql_fetch_array($result);
return $row[0];
}
function update_quota($id,$value)
{
$result = mysql_query("UPDATE `max_traffic` SET `limit`='$value' WHERE
id='$id'")
or die(mysql_error());
return $value;
}
if ( quota(1) != 0)
$limit = quota(1);
else
$limit = 0;
$multipart = false;
//was a part of the file requested? (partial download)
$range = $_SERVER["HTTP_RANGE"];
if ($range)
{
//pass client Range header to rapidshare
// _insert($range);
$cookie .= "\r\nRange: $range";
$multipart = true;
header("X-UR-RANGE-Range: $range");
}
$url = 'http://127.0.0.1/puppy.iso';
$filename = basename($url);
//octet-stream + attachment = client always stores file
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$filename.'"');
//always included so clients know this script supports resuming
header("Accept-Ranges: bytes");
//awful hack to pass rapidshare the premium cookie
$user_agent = ini_get("user_agent");
ini_set("user_agent", $user_agent . "\r\nCookie: enc=$cookie");
$httphandle = fopen($url, "r");
$headers = stream_get_meta_data($httphandle);
$size = $headers["wrapper_data"][6];
$sizer = explode(' ',$size);
$size = $sizer[1];
//let's check the return header of rapidshare for range / length indicators
//we'll just pass these to the client
foreach ($headers["wrapper_data"] as $header)
{
$header = trim($header);
if (substr(strtolower($header), 0, strlen("content-range")) ==
"content-range")
{
// _insert($range);
header($header);
header("X-RS-RANGE-" . $header);
$multipart = true; //content-range indicates partial download
} elseif (substr(strtolower($header), 0, strlen("Content-Length")) ==
"content-length")
{
// _insert($range);
header($header);
header("X-RS-CL-" . $header);
}
}
if ($multipart) header('HTTP/1.1 206 Partial Content');
flush();
$speed = 4128;
$packet = 1; //this is private dont touch.
$bufsize = 128; //this is private dont touch/
$bandwidth = 0; //this is private dont touch.
while (!(connection_aborted() || connection_status() == 1) && $size > 0)
{
while (!feof($httphandle) && $size > 0)
{
if ($limit <= 0 )
$size = 0;
if ( $size < $bufsize && $size != 0 && $limit != 0)
{
echo fread($httphandle,$size);
$bandwidth += $size;
}
else
{
if( $limit != 0)
echo fread($httphandle,$bufsize);
$bandwidth += $bufsize;
}
$size -= $bufsize;
$limit -= $bufsize;
flush();
if ($speed > 0 && ($bandwidth > $speed*$packet*103))
{
usleep(100000);
$packet++;
//update_quota(1,$limit);
}
error_log(update_quota(1,$limit));
$limit = quota(1);
//if( $size <= 0 )
// exit;
}
fclose($httphandle);
}
exit;
?