Kilho.net
IT Ramblings

Mit PHP erstelltes einfaches CDN-Servicemodul

Um die Traffic-Last zu verringern, habe ich CloudFlare verwendet. Dabei habe ich festgestellt, dass die Verbindung über LAX (Los Angeles) läuft und dadurch deutlich langsamer ist. Deshalb habe ich kurzfristig etwas erstellt, um es als CDN zu verwenden.

Der Server befindet sich in Tokio (Vultr).

Das Prinzip: kilho.net/{파일} wird mit cdn.kilho.net/{파일} verbunden, um den Traffic des Haupt-Hostings zu verteilen.

[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 Kommentar

  1. 양서홍

    eeee

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert