استخدمت CloudFlare لتخفيف ضغط حركة المرور، لكنني لاحظت أن نقطة الاتصال تقع في LAX (لوس أنجلوس)، ما يؤدي إلى بطء كبير في السرعة، فأنشأت هذا الحل على عجل لاستخدامه كنوع من CDN.
يقع هذا الخادم في طوكيو (Vultr).
تقوم الفكرة على تحويل kilho.net/{파일} إلى cdn.kilho.net/{파일} لتوزيع حركة المرور بعيدًا عن الاستضافة الرئيسية.
<?
$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.');
?>
eeee