php 전문가회원님 검토를 바랍니다.[URL Cache를 사용하여 웹을 더욱 빠르게] 정보
php 전문가회원님 검토를 바랍니다.[URL Cache를 사용하여 웹을 더욱 빠르게]관련링크
본문
아래는 링크1에 기술된 내용입니다.
용도인즉슨[URL Cache를 사용하여 웹을 더욱 빠르게]인데..
적용을 해보니 에러만 무쟈게 무한으로 뜹니다.
-------------------------------------------------------
제가 적용해본 결과는 버전G3에
그누가 설치된 딜렉토리에[Cache딜렉토리를 생성하고 퍼미션766]
demo.php 내용을 head.sub.php에 올리고
URLCache.php를 파일로만들어서 딜렉토리에 업시켰습니다.
그결과 무한에러만....
보기엔 간단한것 같았는데..
그누에 적용은 그렇치않은가봅니다.
-------------------------------------------------------
한번 검토해보시고 G3에 적용하는 방법을 알려주세요
=======================================================
demo.php
<?php require "lib/jmrss/URLCache.php"; // Cache 적용하기 Cache(true,"./cache",3600); // Database 연결 $conn = mysql_connect("mysql.ihelpers.co.kr", "xxxxx", "xxxxx"); mysql_select_db("xxxxx",$conn); $sql = "SHOW TABLES"; $result = mysql_query($sql,$conn); echo "<pre>"; while($row = mysql_fetch_array($result)){ print_r($row); } echo "</pre>"; mysql_close($conn); ?> |
URLCache.php 파일은 URLCache 클래스 와 Cache 함수로 이루어져 있습니다. URLCache 클래스는 Cache 파일의 상태를 점검하고 Cache파일에 객체정보를 쓰고 읽는 역할을 수행합니다. Cache 함수는 URLCache 클래스를 기반으로 Cache 여부를 점검하여 Cache읽거나 아님 URL 정보를 읽어와 Cache 파일에 저장하는 함수입니다. Cache 함수는 기존에 사용하고 있는 WebApplication 에 Cache 기술을 쉽게 적용하기 위한 함수입니다.
<? /*/////////////////////////////////////////////////////////////// 작성자 : 손상모<*** 개인정보보호를 위한 이메일주소 노출방지 ***> 웹사이트 : http://www.ihelpers.co.kr 최초작성일 : 2004.10.25 변경내용 : 2004.11.01 Class외에 Cache 함수 추가 /////////////////////////////////////////////////////////////////*/ /** * URLCache Class * * URL 정보를 Cache 하는 Class입니다. * * @author Sang Mo,Son <*** 개인정보보호를 위한 이메일주소 노출방지 ***> * @version 0.9 beta * @access public */ class URLCache { var $CacheDir; var $Interval; /** * Constructor * * @param String Cache Directory * @param int Url Stale Time(s) * @access public * @return void */ function URLCache($CacheDir = './cache',$Interval = 3600){ $this->CacheDir = $CacheDir; $this->Interval = $Interval; } /** * Set Cache Directory * * @param int Url Stale Time * @access public * @return void */ function setCacheDir($CacheDir){ $this->CacheDir = $CacheDir; } /** * Set Url Stale Time(s) * * @access public * @return void */ function setInterval($Interval){ $this->Interval = $Interval; } /** * URL 정보를 파일명으로 변경 * * @param string url * @access private * @return string */ function _makeFileName($url){ return $this->CacheDir."/".md5($url); } /** * Serialize The Content * * @param object content * @access private * @return string */ function _serialize($object){ return serialize($object); } /** * Unserialize The Content * * @param string content * @access private * @return object */ function _unserialize($content){ return unserialize($content); } /** * Error 정보 처리 * * @param string error message * @access public * @return void */ function Error($errmsg){ printf($errmsg); } } /** * URL 정보에 대한 Cache 함수 * * @access public * @param boolean isCache * @param string Cache Directory * @param int lifetime * @return boolean */ function Cache($iscache = true,$cachedir = './cache',$lifetime = 3600){ global $HTTP_GET_VARS,$HTTP_POST_VARS,$HTTP_SERVER_VARS; if($iscache == true && $HTTP_GET_VARS['CACHE'] != "NOCACHE" && count($HTTP_POST_VARS) == 0){ $url = sprintf("http://%s%s",$HTTP_SERVER_VARS['HTTP_HOST'],$HTTP_SERVER_VARS['REQUEST_URI']); $urlcache = new URLCache($cachedir,$lifetime); $result = $urlcache->CheckCache($url); if($result == 1){ // lifetime 이전 $html = $urlcache->get($url); } else { // lfietime 이후 또는 Cache파일이 없을 경우 $curl = sprintf("http://%s%s?CACHE=NOCACHE&%s",$HTTP_SERVER_VARS['HTTP_HOST'], $HTTP_SERVER_VARS['PHP_SELF'],$HTTP_SERVER_VARS['QUERY_STRING']); $fd = fopen ("$curl", "r"); $content = ""; while (!feof ($fd)) { $buffer = fgets($fd, 4096); $content .= $buffer; } $html['body'] = $content; $urlcache->set($url,$html); } echo $html['body']; exit; } else { return false; } } ?> |
댓글 전체
뭔뜻인지 잘은 모르겠지만 내용을 제맘대로 해석해보면 한번 열어본 페이지는 캐시파일로
저장하고 업데이트가 없을경우 저장한 캐시파일 페이지를 보여주며 업데이트가 있을경우
서버에서 받아오게 한후 저장된 캐시파일을 업데이트 시키고 업데이트가 없을때는
3600초? 동안은 저장한 캐시파일을 보여준다? 인듯....^^
위 정보는 정확한게 아니며 제마음대로 해석하고 짜집기 해본 겁니다.ㅋㅋㅋ
저장하고 업데이트가 없을경우 저장한 캐시파일 페이지를 보여주며 업데이트가 있을경우
서버에서 받아오게 한후 저장된 캐시파일을 업데이트 시키고 업데이트가 없을때는
3600초? 동안은 저장한 캐시파일을 보여준다? 인듯....^^
위 정보는 정확한게 아니며 제마음대로 해석하고 짜집기 해본 겁니다.ㅋㅋㅋ
짝짝짝~ 맞습니다..헐랭이님..바르게 해석하신것 같습니다...
근데..그것이 별거아닌 것 같은데..적용한번 해보니...에러만 무쟈게 줍디다...ㅎㅎ
그래서 아직 연구중입니다.
근데..그것이 별거아닌 것 같은데..적용한번 해보니...에러만 무쟈게 줍디다...ㅎㅎ
그래서 아직 연구중입니다.
에러날 이유는 별로 없을 것 같은데요.....
저장디렉토리 경로만 잘 맞추어주고
퍼미션만 777 로 주면 되겠습니다.
저장디렉토리 경로만 잘 맞추어주고
퍼미션만 777 로 주면 되겠습니다.
안녕하세요..유창화님..그러게나 말입니다..
딜렉토리와 퍼미숀...점검했었는데..에러 남발입니다..ㅎㅎ
아무래도 제 홈에쓰인 인덱스 관련 소스들이
위의 소스랑은 맞지않는 것 같습니다..
딜렉토리와 퍼미숀...점검했었는데..에러 남발입니다..ㅎㅎ
아무래도 제 홈에쓰인 인덱스 관련 소스들이
위의 소스랑은 맞지않는 것 같습니다..
에러 나는페이지를 봤으면 좋겠는데요
지금은 제홈에서 완전히 분리시켰는데..보시고싶어하시니..
대의를 위해 다시한번 연결 시켜보겠습니다.
http://www.ww0ww.net
에 23시15분쯤에 접속해보세요..
그럼..
대의를 위해 다시한번 연결 시켜보겠습니다.
http://www.ww0ww.net
에 23시15분쯤에 접속해보세요..
그럼..
지금 작업해봤습니다..확인후 확인여부를 코멘트로 알려주세요..^^
에러메세지 확인했습니다
현재 저것은 인클루드 경로를 잘못 주었군요
require "lib/jmrss/URLCache.php";
이런식으로 사용하실때
인덱스 페이지를 기준으로 상대경로로 인클루드 하던가
절대경로로 인클루드 해야 합니다
현재 저것은 인클루드 경로를 잘못 주었군요
require "lib/jmrss/URLCache.php";
이런식으로 사용하실때
인덱스 페이지를 기준으로 상대경로로 인클루드 하던가
절대경로로 인클루드 해야 합니다
네 또 확인해보니
fopen 에러이군요
fopen이 url읽는 것을 막고 있어서 에러가 납니다.
fopen 에러이군요
fopen이 url읽는 것을 막고 있어서 에러가 납니다.
네..감사합니다..
인클루트경로는 상대경로 및 절대경로 두가지 다...해본 상태였었고요..
url읽는 것을 막고 있어서 에러가 난다는 코멘트가 퍼뜩 와닺습니다..
제가 보안 문제때문에 소스상 장치(?)들을 가미 한것이
이렇게 된것 같습니다..
확인해주셔서 감사드립니다..
인클루트경로는 상대경로 및 절대경로 두가지 다...해본 상태였었고요..
url읽는 것을 막고 있어서 에러가 난다는 코멘트가 퍼뜩 와닺습니다..
제가 보안 문제때문에 소스상 장치(?)들을 가미 한것이
이렇게 된것 같습니다..
확인해주셔서 감사드립니다..
$fd = fopen ("$curl", "r");
$content = "";
while (!feof ($fd)) {
$buffer = fgets($fd, 4096);
$content .= $buffer;
}
이부분을 아랫것을로 대치하고
$content = Yreadfile($curl);
아래 함수를 해당소스에 포함시키십시오.
//http, GET 방식의 소켓연결
function Ysockopen($url, $referer='', $accept='*/*', $contenttype='application/x-www-form-urlencoded', $cachecontrol='private', $pragma='no-cache', $connection='close'){
if (!empty($url) && preg_match("`^http://.+`i", $url)) {
$array = parse_url($url);
$url_scheme = Yvar_check($array['scheme']);
$url_server = Yvar_check($array['host']);
$url_path = Yvar_check($array['path']);
$url_query= Yvar_check($array['query']);
$url_port = Yvar_empty_check($array['port'], 80);
$fp = fsockopen($url_server, $url_port);
if (empty($fp)) {
return false;
}
fputs($fp, "GET " . $url_path . "?" . $url_query . " HTTP/1.0\n");
if (!empty($accept)) fputs($fp, "Accept: " . $accept . "\n");
if (!empty($contenttype)) fputs($fp, "Content-Type: " . $contenttype . "\n");
fputs($fp, "Host: $url_server:$url_port\n");
if (!empty($referer)) fputs($fp, "Referer: " . $referer . "\n");
if (!empty($cachecontrol)) fputs($fp, "Cache-control: " . $cachecontrol . "\n");
if (!empty($pragma)) fputs($fp, "Pragma: " . $pragma . "\n");
if (!empty($connection)) fputs($fp, "Connection: " . $connection . "\n\n");
return $fp;
}
else {
return false;
}
}
function Ysockclose(&$fp){
if (!empty($fp)) fclose($fp);
return true;
}
//소켓으로 외부파일 통째로 텍스트로 읽어옴
function Yreadfile($url, $referer='', $accept='*/*', $contenttype='application/x-www-form-urlencoded', $cachecontrol='private', $pragma='no-cache', $connection='close') {
$fp = Ysockopen($url, $referer, $accept, $contenttype, $cachecontrol, $pragma, $connection);
if (!empty($fp)) {
$text = '';
$check_header = false;
while (!feof($fp)){
$temp = fgets($fp, 1024);
if ($check_header == false){
//실제 파일이 아닌 헤더 정보인지 체크 하여 추가하지 않는다.
if (preg_match("'^(\r)?\n$'", $temp)) {
$check_header = true;
continue;
}
}
else{
//헤더 정보가 아닌 경우에만 추가한다.
$text .= $temp;
}
}
Ysockclose($fp);
return $text;
}
else {
return '';
}
}
$content = "";
while (!feof ($fd)) {
$buffer = fgets($fd, 4096);
$content .= $buffer;
}
이부분을 아랫것을로 대치하고
$content = Yreadfile($curl);
아래 함수를 해당소스에 포함시키십시오.
//http, GET 방식의 소켓연결
function Ysockopen($url, $referer='', $accept='*/*', $contenttype='application/x-www-form-urlencoded', $cachecontrol='private', $pragma='no-cache', $connection='close'){
if (!empty($url) && preg_match("`^http://.+`i", $url)) {
$array = parse_url($url);
$url_scheme = Yvar_check($array['scheme']);
$url_server = Yvar_check($array['host']);
$url_path = Yvar_check($array['path']);
$url_query= Yvar_check($array['query']);
$url_port = Yvar_empty_check($array['port'], 80);
$fp = fsockopen($url_server, $url_port);
if (empty($fp)) {
return false;
}
fputs($fp, "GET " . $url_path . "?" . $url_query . " HTTP/1.0\n");
if (!empty($accept)) fputs($fp, "Accept: " . $accept . "\n");
if (!empty($contenttype)) fputs($fp, "Content-Type: " . $contenttype . "\n");
fputs($fp, "Host: $url_server:$url_port\n");
if (!empty($referer)) fputs($fp, "Referer: " . $referer . "\n");
if (!empty($cachecontrol)) fputs($fp, "Cache-control: " . $cachecontrol . "\n");
if (!empty($pragma)) fputs($fp, "Pragma: " . $pragma . "\n");
if (!empty($connection)) fputs($fp, "Connection: " . $connection . "\n\n");
return $fp;
}
else {
return false;
}
}
function Ysockclose(&$fp){
if (!empty($fp)) fclose($fp);
return true;
}
//소켓으로 외부파일 통째로 텍스트로 읽어옴
function Yreadfile($url, $referer='', $accept='*/*', $contenttype='application/x-www-form-urlencoded', $cachecontrol='private', $pragma='no-cache', $connection='close') {
$fp = Ysockopen($url, $referer, $accept, $contenttype, $cachecontrol, $pragma, $connection);
if (!empty($fp)) {
$text = '';
$check_header = false;
while (!feof($fp)){
$temp = fgets($fp, 1024);
if ($check_header == false){
//실제 파일이 아닌 헤더 정보인지 체크 하여 추가하지 않는다.
if (preg_match("'^(\r)?\n$'", $temp)) {
$check_header = true;
continue;
}
}
else{
//헤더 정보가 아닌 경우에만 추가한다.
$text .= $temp;
}
}
Ysockclose($fp);
return $text;
}
else {
return '';
}
}
감사합니다..다시 시행해보고 리플드리겠습니다..
조금 빨라졌군요
해당 사이트가 느린것은 처리에서 느린것보다
클라이언트 컴퓨터가 해당 페이지를 해석하는데 오래걸리는듯 합니다.
해당 사이트가 느린것은 처리에서 느린것보다
클라이언트 컴퓨터가 해당 페이지를 해석하는데 오래걸리는듯 합니다.
아마 왼쪽 메뉴 때문에 늦게 로딩될 확률이 제일 높습니다.
바르게 보셨습니다...
예전부터 홈페이 속도때문에 고민중이었고
네비게이션메뉴에서 얼마간 속도를 잡아먹는 걸 캐취했지만
마땅히 적당한 메뉴가없어서 그냥 두고있는 실정입니다.
그해당메뉴의 소스들도 스크립트를 수정가미해서 쓰다보니..
어디가 속도를 잡아먹는지까지는 점검을 할 수 없더라구요...
그래서...위와같은 소스로 속도를 높여볼려고 ^^...@
노력중에 있습니다..
예전부터 홈페이 속도때문에 고민중이었고
네비게이션메뉴에서 얼마간 속도를 잡아먹는 걸 캐취했지만
마땅히 적당한 메뉴가없어서 그냥 두고있는 실정입니다.
그해당메뉴의 소스들도 스크립트를 수정가미해서 쓰다보니..
어디가 속도를 잡아먹는지까지는 점검을 할 수 없더라구요...
그래서...위와같은 소스로 속도를 높여볼려고 ^^...@
노력중에 있습니다..
해당사이트는 해당 메뉴때문에
어떤 캐쉬를 적용하여도
별반 효과를 볼수 없습니다.
위에서 말씀 드렷듯이
클라이언트가 해석하는데 시간이 걸리는 부분이니까요
어떤 캐쉬를 적용하여도
별반 효과를 볼수 없습니다.
위에서 말씀 드렷듯이
클라이언트가 해석하는데 시간이 걸리는 부분이니까요
아..그렇군요...
어떻게든 보완을 해야겠는데..에휴..
도움말주셔서 감사드립니다.
어떻게든 보완을 해야겠는데..에휴..
도움말주셔서 감사드립니다.
음 저 메뉴는 메뉴수가 적으면 별문제가 없는데
메뉴가 많아지면 문제가 많습니다.
메뉴가 많아지면 문제가 많습니다.
Ajax쪽으로 가닥을 잡아보던가
flash와 php연동으로 가닥을 잡아보셔야 할것 같습니다
flash와 php연동으로 가닥을 잡아보셔야 할것 같습니다
많은 도움말 감사드립니다..^^....@
앞으로도 자주뵈요..
앞으로도 자주뵈요..
네 자주 뵙겠습니다