[최경민]님이 남기신 글:
>안녕하세요..항상 도움 많이 받고 있습니다.
>항상 여기 저기서 훌륭한 소스나 팁을 많이 접하곤 하는데,
>건성으로 넘겨서 지나칠때도 있는데,
>
>전에도 봤는데, 산이님의 무단링크 방지에 관한글 정말 감동입니다.
>
>솔직히 아파치 설치만 하고, 그냥 기본적인것만 설정하고 지나치곤 했는데,
>
>이미지에 관한 action 지시자를 이용하는 방법 정말 간단하면서도 완전하네요.^^;;
>
>이런 좋은 팁들 정말 감사하고, 홈페이지에 이렇게 유익한 팁들을 많이 올려주시면 정말 감사하겠습니다.
>솔직히 욕심 같아선 강좌 같은 걸 여시면 정말 열심히 할것 같은데 ^^
>
>그런데 자세히 보니 알파 문서에 있네요 ㅡㅡ;;
>아무튼 감사감사......
>
>산이님 짱~
>
>아래 링크의 산이님 코멘트:
>
>http://www.phpschool.com/bbs2/inc_view.html?id=9300&code=tnt2&start=0&mode=search&field=title&search_name=&operator=and&period=all&category_id=&s_que=%B9%AB%B4%DC%B8%B5%C5%A9
========================================
... 앗...
그때 잠깐 짠 스크립트입니다.
제가 찾기 힘들어서 알파문서에 올려놓았습니다.
그런데 약간 문제가 있습니다.
즉 304 status code 문제인데,
위의 스크립트는 항상 200 status 코드를
전송하기 때문에 매번 항상 같은 이미지를 전송하는
불합리성이 있습니다.
즉
이미지는 거의 바뀌지 않는 정적인 파일이지만 PHP 자체
속성이 항상 200 status code 이므로 이미지를 전송하기 전에
적절한 헤더를 날려줘야 합니다.
해결책:
## static or vitural file caching
##
function header_filecache($days=1, $file='')
{
global $_SERVER; // for PHP/4.0.x
if($file && !@file_exists($file)) return FALSE;
$term = (int)$days; // alway $days > 0
$req = $_SERVER['HTTP_IF_MODIFIED_SINCE']; // request modified datetime
$time = array();
$time['expire'] = $term * 86400; // expire term, after cached
$time['client'] = $term * 300; // client 'think time', or keepalive
if($file)
{
$time['cur'] = $time['chk'] = @filemtime($file);
} else
{
$time['cur'] = time(); // virual file mtime
$time['chk'] = $time['cur'] - $time['expire'];
}
if($req && strtotime($req)>=$time['chk'])
{
header('HTTP/1.1 304 Not Modified');
exit; // don't print any messages
}
header('Expires: '.gmdate('D, d M Y H:i:s T',$time['cur']+$time['expire']));
header('Last-Modified: '.gmdate('D, d M Y H:i:s T',$time['cur'])); // GMT
header('Cache-control: private, max-age='.$time['client'].', pre-check='.$time['client']);
return TRUE; // alway true
}
위의 함수를 등록하고,
readfile($img); 앞에
header_filecache(4,$img);
readfile($img); 앞에
이렇게 함수를 호출하도록 하면 됩니다. |