주화면의 최신글을 preload로 빠르게... > 그누4 팁자료실

그누4 팁자료실

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

주화면의 최신글을 preload로 빠르게... 정보

주화면의 최신글을 preload로 빠르게...

본문

주화면의 최신글을 preload로 빠르게...


리디폭스님이 어딘가에 제로보드들 위해 공개하신 팁입니다.
리디님의 공개승락이 있습니다.
홈피링크로 원본글을 대신함을 이해해 주세요.
----- http://reedyfox.com/

원저자의 원본 설명을 약간 소개한 다음, g4용으로 하는요령(?)을 정리하죠.

:::::::::::

php가 돌아가는 곳이라면 어디든지 가능합니다.

방법은 비교적 간단한데, 자신의 홈페이지 메인화면에서 사용자 설정에 구애받지 않고 항상 일정한 인터페이스를 보여주는 부분, 특히 DB에 부담을 주는 부분을 찾습니다. 기곳 생각하는 섬을 예로 든다면 메인 좌측 하단 칼럼 리스트가 될 것입니다. 무려 40개의 목록을 DB에서 불러오니깐요. 또 자게와 질게 목록도 해당되겠지만 일단 칼럼 리스트만 예로 들겠습니다.

메인페이지 소스에서 칼럼 리스트에 해당하는 부분이

print_bbs("fox/bbs_contents", "리디의 생각하는 글", "fox", "1", 4, 15);
print_bbs("fox/bbs_contents", "리디의 헤드라인", "fox", "2", 4, 15);
print_bbs("fox/bbs_contents", "준희의 칼럼 I <i>hope</i>", "june", "1", 4, 15);
print_bbs("fox/bbs_contents", "준희의 헤드라인", "june", "2", 4, 15);

이겁니다.
요부분을 잘라내어 새로운 파일에 붙여넣습니다. 다음과 같이 하시면 됩니다.

<?
print_bbs("fox/bbs_contents", "리디의 생각하는 글", "fox", "1", 4, 15);
print_bbs("fox/bbs_contents", "리디의 헤드라인", "fox", "2", 4, 15);
print_bbs("fox/bbs_contents", "준희의 칼럼 I <i>hope</i>", "june", "1", 4, 15);
print_bbs("fox/bbs_contents", "준희의 헤드라인", "june", "2", 4, 15);
?>

그리고 이 파일을 preload_in.php 라는 이름으로 저장해 업로드합니다.
그다음, 위 최근게시물 소스를 잘라낸 부분은 비어 있겠죠? 거기에는 이렇게 적어줍니다.

<? include "경로.../preload_out.php"; ?>

그리고

<?
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 = "홈페이지URL/preload_in.php";
$data = readURL($url);

$fn = "홈페이지URL/preload_out.php";
$fd = fopen($fn, "w");
fwrite($fd, $data);
fclose($fd);

?>

이걸 prelo0ad_exec.php 라는 이름의 파일로 저장해 업로드합니다.

끝으로 write_ok.php delete_ok.php comment_ok.php del_comment_ok.php list_all.php
이 다섯 개 파일을 열어 거의 끝부분쯤에

include "경로/preload_exec.php";

exam::  include "../index/dm_body_preload_exec.php";

라고 적어줍니다. 끝부분이란, 디비연결이 끊기거나 페이지 이동이 일어나기 바로 전을 말합니다.

잠깐 주의 할 것은 preload_out.php 의 퍼미션이 707 또는 777 이어야합니다. 들어있는 디렉토리도 마찬가지고요.


원리는 이렇습니다. 글 작성/삭제, 코멘트 작성/삭제, 게시물 정리시에 preload_exec.php가 호출되면서 preload_in.php 에 설정해둔 최근게시물 소스 내용대로 preload_out.php 에 생성이 됩니다.
그러면 메인페이지에서 순수한 html 페이지인 preload_out.php 를 인클루드 하게 되는 것이지요. 누군가 글을 쓰고 지우기 전까지는 내용에 변동이 없으므로 DB를 건드릴 필요가 없게 됩니다.

Homepage : http://reedyfox.com/

::::::

기본은 루트에 작성하는 게 좋습니다. 경로 문제가 해결되면 원하는 디렉에 넣으시구요.

1. preload_exec.php 작성
<?
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://www.mydomain.com/preload_in.php";
$data = readURL($url);

$fn = "../preload_out.php";
$fd = fopen($fn, "w");
fwrite($fd, $data);
fclose($fd);
ini_set("allow_url_fopen","0");
?>

**** ini_set("allow_url_fopen","1"); ini_set("allow_url_fopen","0"); 이거 중요함, 이거 땜시 한달을 헤맸음.... url_fopen 이 on 이든 아니든 오류는 제 컴에서는 났었음.

2. g4/bbs/write_update.php 461 goto_url 위에 include
즉,
include_once ("../../preload_exec.php");  // 파일의 경로가 루트인 제 경우.
goto_url("./board.php?bo_table=$bo_table&wr_id=$wr_id&page=$page" . $qstr);

3. preload_in.php 을 작성
전 아래와 같이 했습니다.

<?
include_once("./_common.php");
include_once("$g4[path]/lib/latest.lib.php");
$g4[title] = "";  //요건 없앨려다 무셔서 놔뒀음 ;;
?>

<!-- 메인화면 최신글 시작 -->
<table border="0" width="100%" id="noti">
<tr>
<td>
<table border="0" width="100%" id="noti">
<tr>
        <td width="600" height="34%" valign="top">
<?=latest(bluewing_bbs, noti, 5, 70);?>
        </td>
</tr>
</table>
<table border="0" width="100%" id="body1">
<tr  valign="top">
        <td width="300" height="62">
        <?=latest(bluewing_bbs, notice, 5, 70);?>
        </td>
        <td width="300" height="62">
<?=latest(bluewing_bbs, free, 5, 70);?>
</td>
</tr>
</table>
<table  border="0" width="100%" id="body_2" valign="top">
<tr>
<td width="300" height="62" rowspan="2" valign="top">
<?=latest(Ms_L1_050706, event_gallery, 3, 70);?>
</td>
        <td width="300" height="31" valign="top">
  <?=latest(Ms_L1_050706, bbsgallery, 3, 70);?>
</td>
</tr>
</table>
<table  border="0" width="100%" id="body_4" valign="top">
<tr>
<td width="300" height="62" rowspan="2" valign="top">
  <?=latest(Ms_L1_050706, wallpaper, 5, 70);?>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!-- 메인화면 최신글 끝 -->

4. preload_out.php 파일을 만듬. (없어도 되지만, 0바이트로 하나 만들어서 어케 되나 보는 것도 잼있음.....)

5. index.php에
include("preload_out.php"); 을 넣어 주세요.

6. 약간의 삽질 - 경로맞추기
대부분은 잘될 겁니다. 잘 안되면, 파일을 http://www.ydomain.php/preload_in.php 이렇게 익스에서 찍어 보세요.

접속이 많을 수록 좋다고 합니다.

혹시 저처럼경로가 어려운 분은 아래소스를 pathfinder.php 등으로 만들어서 해당 디렉에 넣어서 익스에서 호출하면 도움이 될 겁니다.

// 절대경로 알아내기
<?
global $PHP_SELF;

$thisfilename=basename(__FILE__);
$temp_filename=realpath(__FILE__);
if(!$temp_filename) $temp_filename=__FILE__;
$osdir=eregi_replace($thisfilename,"",$temp_filename);
unset($temp_filename);

$virdir = eregi_replace($thisfilename,"",$PHP_SELF);


echo "현재 디렉토리의 절대경로 : ".$osdir."<br>";
echo "현재 디렉토리의 상대 경로 주소 : ".$virdir."<br>";
?>
추천
0

댓글 3개

이걸, 생각으로만 하고있었는데, 많은 기관사이트에서도 이렇게 사용하는걸 들었는데,
소스를 공개해주니 감사합니다.
적용해보려니 시간이 필요하네요.. 맨날 야근이라..
쩝..
암튼 감사합니다.
꼭 구현해 보고 싶은 획기적인 방법이라 생각됩니다.

경로 문제는 없어 보이는데 preload_exec.php 에서
4, 23, 24, 25 열에서 아래와 같은 에러가 발생됩니다.

fopen(): URL file-access is disabled in the server configuration in~~
fopen(http://도메인/g4/preload/preload_in.php): failed to open stream: no suitable wrapper could be found in~~

fopen(): URL file-access is disabled in the server configuration in~~

fopen(http://도메인/g4/preload/preload_out.php): failed to open stream: no suitable wrapper could be found i~~

fwrite(): supplied argument is not a valid stream resource in~~

fclose(): supplied argument is not a valid stream resource in~~

그리고 말씀하신
write_ok.php delete_ok.php comment_ok.php del_comment_ok.php list_all.php 파일가운데
네개의 파일은 최신버전에서 ~.update.php등 대체파일을 찾아서 수정했습니다.
list_all.php 파일은 최신 버전에 없는데 나머지 네개의 파일만 수정하면 되는지 궁금합니다.

ps)
서버에 allow_url_fopen Off 로 설정되 있습니다.
검색해보니 택와이드님의 코멘트 중에 php4.3.4 부터 아래 코드가 적용되지 않는다는 내용이 있군요.
'ini_set('allow_url_fopen',1); 은 php.ini의 allow_url_fopen = On 과 동일하다'
결국 소켓으로 구현하는 방법을 권장 하셨던데 소개 링크에 가서 열심히 구경만 했습니다.
서버에 allow_url_fopen Off 로 설정되어 있어도 유저 php.ini를 사용하거나, virtual host설정에서 풀 수 있습니다.
아니면 다른 함수를 사용하셔도 됩니다.
전체 12 |RSS
그누4 팁자료실 내용 검색

회원로그인

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