PHP로 만든 단순한 CDN 서비스 모듈

 

트래픽 부하를 줄이기 위해 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.');
?>

HTTP 접속 정보 기록

php-151199_640

 

OpenAPI 이용시 테스트 겸 접속 정보가 제대로 됬는지 확인용

접속시 메소스값, 호스트, POST 값


<?
$log = $_SERVER['REQUEST_METHOD'].' '.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."\n\n";

foreach($_SERVER as $k => $v)
{
if($k=='HTTP_HOST') continue;
if(substr($k, 0,5)!='HTTP_') continue;
$log .= '$k: $v'."\n";
}

$log .= "\n";

$post = array_map('urldecode', explode('&', file_get_contents('php://input')));
foreach($post as $v)
{
$log .= "$v\n";
}

$log .= "-----------------------------------\n";

file_put_contents('log.txt', $log, FILE_APPEND | LOCK_EX);
?>

워드프레스, 테마 업데이트

워드프레스 4.5.1, 테마(Enfold) 3.5.4 로 업데이트 되었습니다.

사이트 이용시 오류가 발생한 경우 알려주시면 확인 후 빠른 수정하겠습니다.

 

감사합니다.

구글API 를 이용하여 단축링크 만들기

단축링크가 필요해서 PHP 로 만들었습니다.

구글 API 등록 후 사용하시면 됩니다.

 

사용방법 : shorturl_google(‘원래 주소’, ‘API키’);

 


<?php

function shorturl_google($url, $key)
{
$post = array('longUrl' => $url);
$json = json_encode($post);

$curlObj = curl_init();

curl_setopt($curlObj, CURLOPT_URL, 'https://www.googleapis.com/urlshortener/v1/url?key='.$key);
curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curlObj, CURLOPT_HEADER, 0);
curl_setopt($curlObj, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
curl_setopt($curlObj, CURLOPT_POST, 1);
curl_setopt($curlObj, CURLOPT_POSTFIELDS, $json);

$json = json_decode(curl_exec($curlObj));

curl_close($curlObj);

return $json->id;
}

echo shorturl_google('http://kalmuri.kilho.net/', 'API-KEY-API-KEY-API-KEY');

?>

텐핑 API 를 이용하여 광고하기

페이스북에서 텐핑 광고가 보여서 테스트 겸 PHP 로 작성해봅니다.

텐핑 사이트 내 수익 순위를 통해, 전체 매출을 생각해 보면 과연 운영을 오래 할 수 있을런지 ;;

테스트 후 실적이 괜찮으면, 텐핑을 활용한 여러 방법(클릭률 최적화 등)을 작성하도록 하겠습니다.

(* 소스는 선배로 등록한 분에게만 ㅎㅎ)

아무튼, 텐핑 API 를 이용해서 출력하는 예제입니다.

  1. 텐핑 가입
  2. “http://tenping.kr/API”  접속
  3. “API 가이드” – “Request URL” 을 복사
  4. 아래 소스를 사용하는 곳에 복사
  5. $tenping 값을 이용하여 출력
<?php

$cache_file = './data/list.json'; // 캐시파일 저장 위치
$cache_time = 1800; // 캐시할 시간

if(is_file($cache_file))
{
$data = file_get_contents($cache_file);

if(time()-filemtime($cache_file)>$cache_time = 1800) $data = '';
}

if(!$data)
{
// API 에서 복사한 Request URL 를 입력합니다.
// CampainType 은 아래에서 원하는 타입을 선택하여 더한 값입니다.
// (1:CPC+5, 2:CPA, 4:CPS, 8:CPI, 32:CPV, 64:CPADB, 128:CPC)
$url = 'http://tenping.kr/adbox/list?MemberID=?!?!?!?!?!?!?&CampaignType=129&MinClickPoint=30&MinCurrentPoint=1000';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);

file_put_contents($cache_file, $data);
}

$json = json_decode($data, true);

if($json['ResultCode'] == '200')
{
$tenping = $json['List'][mt_rand(0, count($json['List'])-1)];
}

// $tenping 값을 출력해서 사용하시면 됩니다.

?>

* API 사용시 선배 등록이 안되어 있는 경우 텐핑 콘텐츠의 단가 및 잔여 물량(ClickPoint, CurrentPoint)을 확인 할 수 없습니다.
prince@kilho.net 로 선배 등록 해주시고, 메일로 휴대폰 뒷 4자리를 알려주시면 등록한 분을 확인 할 수 있습니다.
추후, 텐핑 관련된 정보가 나오면 보내드리겠습니다 ^^