2009-03-30 7 views
2

한때 온라인 죽음 감시 플레이어의 작은 그룹을 위해 집에서 만든 포럼 시스템을 실행했습니다. 이 포럼은 오랫동안 폐쇄되어 현재 오프라인 상태입니다. 내가하고 싶은 일은 이전 사용자가 검색 할 수있는 온라인 아카이브가 있기 때문에 전체 시스템에 대한 모든 데이터를 포함하는 정적 HTML 파일을 만드는 것입니다.동적 PHP/MySQL 포럼을 정적 페이지로 영구 캐시

나는 모든 원본 데이터를 제어 할 수 있습니다. 이 포함됩니다 :

  • 이미지
  • 프로필
  • 포럼 스레드
  • 데이터베이스
  • PHP 스크립트

는 기본적으로, 나는, 그래서 방정식에서 데이터베이스를 먹고 싶어 나는 그것을 지키기 위해 자원을 낭비 할 필요가 없습니다. (또한 이것이 집에서 만든 포럼 솔루션이기 때문에 매우 최적화되지 않았 음을 확신합니다)

이것은 가능한 목표입니까, 아니면 포럼을 그대로 유지해야하며 오버 헤드에 대해 걱정하지 않아야합니다. ?

가능한 경우 (그리고 원격으로 실행 가능할 경우) 진행 방법에 대한 몇 가지 제안을받을 수 있습니까?

답변

4

wget은 웹 사이트의 HTML 미러를 만들 수 있습니다. --mirror 사용법은 문서를보십시오.

+0

이것은 내가 찾고있는 대답 인 것으로 보입니다. 'wget -Em url'이 (가) 트릭을했습니다! 고맙습니다. – Strozykowski

0

ceejayoz가 말한 것 또는 응용 프로그램의 부트 스트랩에 캐싱 헤더를 추가 할 수 있습니다. 캐시는 원하는만큼 길어질 수 있습니다.

고객이 원하는 페이지로 캐시 할 시간을 가진 첨부 된 함수를 호출하면 session_start가 캐싱을 방지하는 헤더를 방출하기 때문에 session_start 이후에이 함수를 호출해야합니다.

function client_side_cache($hours) 

{ 
     //in the event a session start is used, I have to clean all the #$%# headers it sends to prevent caching 
     header('Cache-Control: ',true); 
     header("Pragma: ", true); 
     header("Expires: ", true); 

     //get the If-Modified-Since header in a unix time format 
     $headers = getallheaders(); 
     if (isset($headers['If-Modified-Since'])) 
     { 
      $modifiedSince = explode(';', $headers['If-Modified-Since']); 
      $modifiedSince = strtotime($modifiedSince[0]); 
     } 
     else 
     { 
      $modifiedSince = 0; 
     } 

     //calculate the Last-Modified timestamp 
     $current_time=time(); 
     $last_modified=($current_time)/($hours*3600); 
     $last_modified=(int)$last_modified; 
     $last_modified=$last_modified*$hours*3600; 

    //check cache not expires 
     if ($last_modified <= $modifiedSince) 
     { 
      header('HTTP/1.1 304 Not Modified'); 
      exit(); 
     } 

     else //emit a new Last-Modified (either cache expired or page wasn'r cached 
     { 
      Header('Last-Modified: '.gmdate("D, d M Y H:i:s",$last_modified).' GMT '); 
     } 

} 
+0

Stackoverflow에 게시하기 전에 소스 코드에서 불필요한 공백을 제거하십시오. –

+0

2000이 바로 옆에 있습니다. ;-) –

1

출력 버퍼링을 사용하여 모든 출력을 캡처하고 브라우저에 출력하는 대신 파일에 출력합니다.

편집 코드 (브라우저에 대한 HTML 출력 전) 상단에,이 라인이되도록 : 스크립트의 끝에

ob_start(); 

를이 추가 :

$output = ob_get_clean(); 
file_put_contents("<<name of this page>>.html", $output); 

몇 가지 명명 체계가 필요하므로 중복되지 않습니다.

그런 다음 정규식을 사용하여 apache RewriteRules를 사용하여 모든 요청을 새 HTML 페이지로 리디렉션하여 링크가 중단되지 않도록하십시오.

많은 페이지가없는 경우 각각의 페이지를 하나씩 클릭 할 수 있습니다. 수동으로 모든 URL을 배열에 기록한 다음 루프를 반복하거나 크롤링 할 수도 있습니다. 사이트에서 직접 페이지의 모든 URL을 찾고 대기열에 추가합니다.