쿼리없는 빠른 인덱스 페이지 만들기 - fsockopen > 그누4 팁자료실

그누4 팁자료실

그누보드4와 관련된 팁을 여러분들과 함께 공유하세요.
나누면 즐거움이 커집니다.

쿼리없는 빠른 인덱스 페이지 만들기 - fsockopen 정보

쿼리없는 빠른 인덱스 페이지 만들기 - fsockopen

본문

사실상 나스카님과 해뜰녘님의 팁을 정리해서 올리는것 으로 보시면 틀림없을듯 합니다.
요사이 나스카님의 말씀도 있고해서 정리에 대한 강박을 뒤로하고 일단 올려봅니다.
간단한 내용일지 모르겠으나 이런 형태의 구현방법을 찾지 못했고,
단 한 분이라도 필요한 분이 계시다면 충분할것 같습니다.
고수님들께서 보시고 낳은 방법이 있다면 알려주시면 고맙겠습니다.

*글 제목을 상기하시고 아래 과정을 잠간 보시면 무슨일을 하려는지 쉽게 아실 수 있을것입니다.

시작 http://www.sir.co.kr/bbs/tb.php/g4_tiptech/812
과정1 http://www.sir.co.kr/bbs/tb.php/g4_qa/10119
과정2 http://www.sir.co.kr/bbs/tb.php/g4_qa/10352

# 소켓 방식으로의 구현 - 나스카님과 해뜰녘님께서 도와 주셨습니다.
## allow_url_fopen  off off 서버환경에서 fsockopen 을 사용한다.
적용예 http://gnusr.com/g4/?ca_id=test
피드백 http://gnusr.com/g4/bbs/tb.php/forum/79

((예제))
################################ 1 ##############################
http://gnusr.com/g4/preload/sock_preload_in.php
-------------------------------
sock_preload_in.php 화일 만들기
-------------------------------
<?
$g4_path = "..";
include_once("$g4_path/common.php");
include_once("$g4[path]/lib/latest.lib.php");
//테스트를 위해 단 하나의 최신글을 불러오는 구문을 작성했다
?>
<?=latest("basic", future, 5, 50);?>

################################ 2 ##############################
http://gnusr.com/g4/preload/sock_preload_exec.php
----------------------------------
sock_preload_exec.php 화일 만들기
----------------------------------
<?//나스카님 소켓 펑션
function geturl($host,$path) {
$contents="";
$fp = @fsockopen($host, 80, &$errno, &$errstr, 5);
if($fp) {
// 소켓을 이용해서 서버에 html 형태로 테이타를 보냄
fputs ($fp, "GET $path HTTP/1.0\nUser-Agent: Mozilla/4.0\nHost: $host\n\n");

while(!feof($fp)) {
$contents .= fgets($fp,1024);
}
fclose($fp);

return $contents;
}
}
//타 계정 임의의 파일 지정가능 (테스트를 위해 같은 계정내 파일을 지정함)
$htmls=geturl("gnusr.com","/g4/preload/sock_preload_in.php");//실행시킬 파일 지정
//해뜰녘님 헤더자르기
$htmls = trim(substr($htmls,strpos($htmls, "\r\n\r\n")));

echo $htmls;//실제 적용시에는 보여줄 필요가 없으며 주석처리해야한다

//해뜰녘님 결과값 저장
$fp=fopen('/web2/gnusr/www.gnusr.com/g4/preload/sock_preload_out.php','w');
fputs($fp,$htmls);
fclose($fp);
?>

################################ 3 ##############################
http://gnusr.com/g4/preload/sock_preload_out.php
--------------------------------
sock_preload_out.php 화일 만들기
--------------------------------
빈 화일 만들고 퍼미션 707로 설정해준다.

############################### 응용 ##############################

## 1,2,3번의 링크된 경로를 확인해보면 세개의 결과가 똑같아 보인다.

# 1번의 경우는 구문에 따라 실행된것
# 2번의 경우는 1번화일을 소켓으로 읽어들인후 헤더를 잘라내고 나머지 본문을 보여주는것
# 3번의 경우는 2번화일이 호출될때 1번화일의 결과값을 html로 저장해둔것을 보여주는것

> 속도는 3 >1 >2 와 같을것이고,
> 이것을 다수의 최신글이나 디비쿼리를 동반하는 카테고리 메뉴등이 집합된 메인페이지에 적용하려는 것이다.

>> 간단한 응용방법
>> bbs폴더의 코멘트를 포함한 쓰기,수정,삭제등을 담당하는 화일을 열어'// 사용자 코드 실행'을 검색후
>> 바로 아래줄에 2번 화일을 인클루드 한다.
>> // 사용자 코드 실행
>> @include_once ("../../preload/_preload_exec.php");  // 경로수정

>> 메인 페이지의 원하는 부분에 3번 화일을 인클루드 한다.

>>> 결국 방문자의 메인 페이지 접근시 미리 저장된 3번 화일의 내용을 쿼리없이 빠르게 보여주며,
>>> 게시물의 실질적 내용이 바뀌는 이벤트가 일어날때에만 3번 화일의 내용을 갱신해주는 것이다.


# 추가로 allow_url_fopen  on  on 환경이라면 fopen 방식을 사용해도 된다.
<?
ini_set("allow_url_fopen","1");
function readURL($url) {
$fp = fopen($url,"rb");
$file = $fp;
settype($file, boolean);
if ($file) {
while (!feof($fp)) {

$tmp = fgets($fp, 1024);
$temp .= $tmp;
}
fclose($fp);
} else {
$temp = "";
}
return $temp;
}
$url = "http://~/preload_in.php";
$data = readURL($url);

$fn = "http://~/preload_out.php";
$fd = fopen($fn, "w");
fwrite($fd, $data);
fclose($fd);
ini_set("allow_url_fopen","0");
?>
추천
2

댓글 18개

고생하셨습니다.
분명 돌파구가 될 수 있는 자료입니다만,
이 내용을 적절히 매치시키기가 무쟈게 힘듭니다.

아직도 풀리지 않는 의문중 하나가
바로 gnu3.xx에서는 url_fopen에 관계없이
타 사이트의 정보를 가져올 수 있다는 부분입니다.
?doc, $doc 때문에 그런가 휴...
> //해뜰녘님 결과값 저장
> $fp=fopen('/web2/gnusr/www.gnusr.com/g4/preload/sock_preload_out.php','w');

www.gnusr.com으로 기재되어 있습니다.
소스 한번 더 살펴보라는 버들잎으로 알겠습니다 *^^*
깔끔한데요.
현재 네트워크 상황이 여의치 않지만,
확연한 차이가 느껴집니다.

이야...
1번째 소스형태(일반적인 형태)는,
별것 아닌데도 속도가 끝내주네요.
(구현속도에 시간이 좀 더 많이 소요된다는 의미입니다.)
엽기적 경로는 믿거나 말거나 80port의 실제 경로랍니다.
테스트 계정이니 저렴하게 잘 쓰고있다고 봐야 하겠죠?
덕분에 다양한 경험도 하게되고 ...

인덱스에서 보여줘야할 것이 많은 뉴스 사이트 같은곳에서 적용해보면 모르겠습니다만,
달랑 몇개의 메뉴나 최신글이 걸린 곳에서는 속도 차이를 잘 못느끼겠습니다.
디비부하 문제와 속도에 대한것인데, 차차 결론이 나오겠죠!?
그나저나 3.xxx대 뉴스리더스킨도 제 계정에서는 무용지물이 된듯합니다. TT
아 참... 깜빡할 뻔 했는데,
제가 작성한 소켓관련 함수가 아닙니다.
2003년도이던가?!
인터넷에 거의 공식처럼 알려진 소켓함수입니다.
저는 단지 해당 소켓함수를 찾아냈을 뿐입니다.

'플록'님의 경우처럼 php.ini가 설정되어 있다면,
(물론 제 경우도 마찬가지지만...)
gnu3.xx가 됐던, g4가 됐던 RSS Reader는 작동하지 않아야 됩니다.

그런데, 제 경우는 url_fopen이 활성화 되던 시기에
gnu3.xx용 RSS Reader를 설치한 후,
현재는 url_fopen이 막혀있는데도 불구하고,
열심히 잘 긁고 있습니다.

기가막힌 일이지요.
동일서버, 동일계정, 달랑 경로만 다른 gnu3.xx와 g4에서의 차이라는...

틈나면 짬짬이 gnu3.xx용 리더스킨을 뚫어져라 쳐다보고 있습니다.
직관적인 느낌으로는 특별히 손 볼 부분은 없어보이는데,
바로 두 세군데 정도만 손 보면 가능할 것도 같은데...
(물론, sql 쿼리문 쪽은 약간 더 g4에 맞게 손을 봐야 겠지요.)

예전에 잠깐 보셨겠지만,
gnu3.xx 경로의 Reader는 여전히 특별한 문제없이
잘 돌아가고 있습니다.

> 엽기적 경로는 믿거나 말거나 80port의 실제 경로랍니다.
>> 커...ㄱ! 정말 엽기입니다. *^^*
아~ 정말 멋집니다. ^^
특히 쇼핑몰 메인 같은 경우엔 본의아니게(?) 상품이미지를 많이 로딩시켜야 하는데
여기에 최신글까지 표현시키면 정말 느려지죠.
플록님의 팁을 제가 운영하고 있는 영카트4 쇼핑몰에 적용시켰더니 런타임이 몰라볼 정도로 단축되었네요
0.5 대에서 버벅대던 것이 0.2대 까지로 뚝! 떨어졌어요.
체감으로 느끼는 속도는 이것보다 더 빠른 것 같구요.
좋은 팁 알려주셔서 넘 감사드리구요... 福 많이 받으세요 ^^
본 팁에만 한정한다면,
의외로 간단합니다.
단, 그 과정의 이해가 너무나도 쉬울 수 있으므로
간혹 허망할 수도 있습니다.


그나저나 표준말만 쓰시는군요^^;
원래 이넘은 표준말 밖에 모른다고 전해드리랍니다......

아무것도 모르는 상태라 헤롱합니다......^^

일단 배움의 모드로 가야할 것 같습니다.....

행복한 오후 되십시오~~~홍홍~*
워워.. 그냥 읽어오는게 더 빨라버리네요..
서버사양은 좋은데 서버 트래픽이 많아서 그런것 같네요..
아주 잘됩니다.. 근데 속도가 ㅜ.ㅜ;; 이일을 우야하지..
음냐리~ 당장 적용할 일은 없을듯..

이런 팁은 건수가 많은 게시판에서 효과를 볼 수 있죠..
그 전에는 오히려 느린 느낌도 받을 수도..

서버가 널럴하다면 상관없겠졍..
전체 3,310 |RSS
그누4 팁자료실 내용 검색

회원로그인

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