PHPで作られたシンプルなCDNサービスモジュール
CloudFlareを使用してトラフィック負荷を減らしましたが、接続の場所はLAX(ロサンゼルス)でした。そのため、ゆっくりと使用してCDNの形で緊急に使用しました。
サーバーはVultrにあります。
原則は、kilho.net/ {file}がcdn.kilho.net/ {file}に接続されて、メインホスティングのトラフィックを分散させることです。
[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’])
{
ケース「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)
{
ヘッダー( 'http/1.0'。$ filetime);
} else {
「_mime.php」を含める;
$filetype = get_mime($filename);
$lastmodified = filemtime($filename);
$etag = md5_file($filename);
ヘッダー( 'content-type:'。$ filetype);
ヘッダー( 'expires:' .gmdate( 'd、d m y:i:s'、time()+77760000)。 'gmt');
ヘッダー( 'キャッシュコントロール:public、max-age = 77760000');
ヘッダー( 'last-modified:' .gmdate( 'd、d m y:i:s'、$ lastModified)。 'gmt');
ヘッダー(「e:」。$ etag);
ヘッダー(「」 ’’ ’’ ’’ '' '' ’);
if(isset($_SERVER[‘HTTP_IF_MODIFIED_SINCE’]))
{
if($_SERVER[‘HTTP_IF_MODIFIED_SINCE’]== gmdate[‘HTTP_IF_NONE_MATCH’]==$etag)
{
ヘッダー( 'http/1.0 304変更されていない');
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;
ケース「投稿」:
ケース「put」:
ケース「削除」;
break;
}
ヘッダー( 'http/1.0 404ファイルが見つかりません。');
?>
[/PHP]
Comment (1)
eeee