php 전문가회원님 검토를 바랍니다.[URL Cache를 사용하여 웹을 더욱 빠르게] > 십년전오늘

십년전오늘

10년전 추억의 책장을 넘기며

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초? 동안은 저장한 캐시파일을 보여준다? 인듯....^^

위 정보는 정확한게 아니며 제마음대로 해석하고 짜집기 해본 겁니다.ㅋㅋㅋ
짝짝짝~ 맞습니다..헐랭이님..바르게 해석하신것 같습니다...
근데..그것이 별거아닌 것 같은데..적용한번 해보니...에러만 무쟈게 줍디다...ㅎㅎ

그래서 아직 연구중입니다.
안녕하세요..유창화님..그러게나 말입니다..
딜렉토리와 퍼미숀...점검했었는데..에러 남발입니다..ㅎㅎ

아무래도 제 홈에쓰인 인덱스 관련 소스들이
위의 소스랑은 맞지않는 것 같습니다..
지금은 제홈에서 완전히 분리시켰는데..보시고싶어하시니..
대의를 위해 다시한번 연결 시켜보겠습니다.

http://www.ww0ww.net
에 23시15분쯤에 접속해보세요..

그럼..
에러메세지 확인했습니다
현재 저것은 인클루드 경로를 잘못 주었군요
require "lib/jmrss/URLCache.php";
이런식으로 사용하실때
인덱스 페이지를 기준으로 상대경로로 인클루드 하던가
절대경로로 인클루드 해야 합니다
네..감사합니다..
인클루트경로는 상대경로 및 절대경로 두가지 다...해본 상태였었고요..

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 '';
  }
}
조금 빨라졌군요
해당 사이트가 느린것은 처리에서 느린것보다
클라이언트 컴퓨터가 해당 페이지를 해석하는데 오래걸리는듯 합니다.
바르게 보셨습니다...

예전부터 홈페이 속도때문에 고민중이었고
네비게이션메뉴에서 얼마간 속도를 잡아먹는 걸 캐취했지만
마땅히 적당한 메뉴가없어서 그냥 두고있는 실정입니다.

그해당메뉴의 소스들도 스크립트를 수정가미해서 쓰다보니..
어디가 속도를 잡아먹는지까지는 점검을 할 수 없더라구요...

그래서...위와같은 소스로 속도를 높여볼려고 ^^...@
노력중에 있습니다..
해당사이트는 해당 메뉴때문에
어떤 캐쉬를 적용하여도
별반 효과를 볼수 없습니다.
위에서 말씀 드렷듯이
클라이언트가 해석하는데 시간이 걸리는 부분이니까요
전체 135,051
십년전오늘 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT