Kilho.net
IT Ramblings

Jednoduchý modul služby CDN vytvorený v PHP

Používal som CloudFlare na zníženie zaťaženia prevádzkou, no zistil som, že keďže umiestnenie pripojenia je LAX (Los Angeles), rýchlosť sa výrazne znížila. Preto som narýchlo vytvoril toto riešenie, aby sa dalo používať ako CDN.

Tento server sa nachádza v Tokiu (Vultr).

Princíp spočíva v presmerovaní kilho.net/{파일} na cdn.kilho.net/{파일}, čím sa rozloží prevádzka hlavného hostingu.

[PHP]

<?
$cfg[‚url‘] = ‚kilho.net‘;
$cfg[‚cache‘] = ‚../data/cache‘;

$url = $_SERVER[‚REQUEST_SCHEME‘].‘://‘.$cfg[‚url‘].$_SERVER[‚REQUEST_URI‘];
$url_arr = parse_url($url);

switch($_SERVER[‚REQUEST_METHOD‘])
{
case ‚GET‘:
$filename = $cfg[‚cache‘].$url_arr[‚path‘];
$dirname = dirname($filename);
if(!is_file($filename))
{
if(!is_dir($dirname)) mkdir($dirname, 0707, true);

$ch = curl_init();
$fp = fopen($filename, ‚w‘);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_REFERER, $_SERVER[‚REQUEST_SCHEME‘].‘://‘.$cfg[‚url‘]);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
fclose($fp);

switch($code = curl_getinfo($ch, CURLINFO_HTTP_CODE))
{
case 200:
break;

default:
touch($filename, $code);
}
curl_close($ch);
}

if(is_file($filename))
{
$filetime = filemtime($filename);

if($filetime<1000)
{
header(‚HTTP/1.0 ‚.$filetime);
} else {
include ‚_mime.php‘;
$filetype = get_mime($filename);
$lastmodified = filemtime($filename);
$etag = md5_file($filename);

header(‚Content-Type: ‚.$filetype);
header(‚Expires: ‚.gmdate(‚D, d M Y H:i:s‘, time()+77760000).‘ GMT‘);
header(‚Cache-Control: public, max-age=77760000‘);
header(‚Last-Modified: ‚.gmdate(‚D, d M Y H:i:s‘, $lastmodified).‘ GMT‘);
header(‚Etag: ‚.$etag);
header(‚Access-Control-Allow-Origin: *‘);

if(isset($_SERVER[‚HTTP_IF_MODIFIED_SINCE‘]))
{
if($_SERVER[‚HTTP_IF_MODIFIED_SINCE‘]==gmdate(‚D, d M Y H:i:s‘, $lastmodified).‘ GMT’||$_SERVER[‚HTTP_IF_NONE_MATCH‘]==$etag)
{
header(‚HTTP/1.0 304 Not Modified‘);
exit;
}
}
}

if(strstr($_SERVER[‚HTTP_ACCEPT_ENCODING‘], ‚gzip‘))
if(in_array($filetype, array(‚text/plain‘, ‚text/html‘, ‚text/css‘, ‚text/javascript‘, ‚application/json‘, ‚application/xml‘)))
ob_start(‚ob_gzhandler‘);

$fp = fopen($filename, ‚rb‘);
fpassthru($fp);
fclose ($fp);

exit;
}

break;

case ‚POST‘:

case ‚PUT‘:

case ‚DELETE‘;
break;
}

header(‚HTTP/1.0 404 File Not Found.‘);
?>

[/PHP]

1 komentár

  1. 양서홍

    eeee

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *