2012-09-14 4 views
2

20,000 페이지가 넘는 동적 사이트를 만들었고 페이지를 만들면 적어도 1 개월 또는 1 년 동안 업데이트 할 필요가 없습니다. 그래서 모든 페이지를 처음 캐싱 할 때 정적 인 html 페이지에서 전달합니다.완전히 동적 인 웹 사이트 캐싱

URL에서 파일 이름을 먼저 검색하려면 PHP 스크립트 (전체 CMS는 PHP에 있음) if (file_exists($filename))을 실행하고 있습니다. 캐시 파일 디렉토리와 일치하면 전달하고 그렇지 않으면 페이지를 생성하고 후자를 위해 캐시합니다. 동적이지만 여전히 내 URL에 ?&=이 포함되어 있지 않습니다.이 URL은 -이며이를 배열로 분할합니다.

내가 알고 싶은 것은 거대한 디렉토리에서 파일을 검색하는 데 어떤 문제가 발생합니까?

ext2 or ext3 (내 서버에는 ext3이 있다고 생각합니다) 파일 시스템의 디렉토리에 저장할 수있는 파일 수에는 문제가 없어야한다고 말하는 Q/A는 this과 비슷하지만 새로운 20-30,000 이상의 파일이있는 경우 파일이 빠르게 감소합니다.

현재 공유 호스트에 있으며 파일을 캐시해야합니다. 내 호스트는 지금까지 충분히 좋은 내 전체 상자에 100,000 파일의 소프트 한도.

누군가 사이트를 캐시하는 방법에 대해 더 잘 이해할 수 있습니까?

+0

windows는 디렉토리 당 많은 수의 파일에 문제가 있습니다 ... 그러나 당신은 창문을 호스팅하는 것을 말하는 것처럼 들리지 않습니다. – Dave

+0

페이지의 내용 만 약간 변경되고 HTML이 아닌 경우 캐싱과 동적 페이지 사이의 절반을 만날 수 있습니다. HTML 템플릿을 디스크와 데이터베이스의 내용에 저장하면됩니다. –

+0

@ReyGonzales : 콘텐츠를 정적으로 처리하는 요점은 HTML 페이지가 PHP 페이지보다 빠르게 (대단히 ** 많은 **) 게재된다는 점입니다. 특히 트래픽이 많은 사이트에서는 더욱 그렇습니다. 그래서 파일의 정적 버전을 가지고 있다면 매번 데이터베이스를 쿼리하는 대신 그 대신 데이터베이스를 쿼리 할 수 ​​있습니다. –

답변

4

모든 20K 파일을 단일 디렉토리에 두지 마십시오. 당신이 액세스 할 수 있도록

는, (예를 들어, 문자로) 디렉토리로 나눈다

:

a/apple-pie-recipe 
j/john-doe-for-presidency 

등 사용자가 파일 시스템에 덜 제약 이상의 파일을 배치 할 수있는 것

, 속도가 빨라진다. (FS가 다른 20k 파일과 함께 디렉토리에있는 파일을 파악할 필요가 없으므로 약 100 단위로 볼 필요가 있습니다)

+0

당신의 제안은 훌륭합니다. 그러나 이것만으로도 충분할 것입니다. 다만 정보가 PHP로 충분히 빠르면 (내가 아는 새로운 파일을 만드는 것보다 빠름) 디렉토리의 20,000 개 파일에서 파일을 검색 할 수 있습니까? – Anuj

+0

@Anuj : 나도 몰라, 너를 위해 충분히 빠르지? 그것을 시도하고 볼 수 있습니다. –

0

내가 할 수있는 파일 수에는 문제가 없어야합니다. ext2와 ext3로 사이에 2 개 큰 차이가 - - 오히려 오래된 문서의 EXT2 또는 EXT3

와 디렉토리에 저장 저널링이 하나가, 다른 하나는 저장 많은의 영향을 감소 디렉토리의 H-TREE 인덱싱 (이다 같은 디렉토리에있는 파일들). ext2 파일 시스템에 저널링을 추가하고이를 ext3으로 마운트하는 것은 쉬운 일이 아니지만 dir_index의 이점을 제공하지는 않습니다. 전체 fsck가 필요합니다.

파일 시스템에 상관없이 중첩 된 디렉토리 구조를 사용하면 시스템을 훨씬 쉽게 관리하고 확장 할 수 있으며 이전 파일 시스템의 성능 문제를 피할 수 있습니다.

-

(그러나 MADARA의 접근 방식은 균등하게 균형 잡힌 트리, OTOH 더 바람직 할 수있는 의미 경로를 갖는 제공하지 않습니다 내가이 글을 쓰는 시작하고 다른 사람이 비슷한 제안했다 참조 이후 3 다른 일을하고 있어요)

예 :

define('GEN_BASE_PATH','/var/data/cache-failes'); 
define('GEN_LEVELS', 2); 

function gen_file_path($id) 
{ 
    $key=md5($id); 
    $fname=''; 
    for ($x=0; $x<=GEN_LEVELS; $x++) { 
     $fname=substr($key, 0, 1) . "/"; 
     $key=substr($key,1); 
    } 
    return GEN_BASE_PATH . "/" . $fname . $key; 
} 

그러나 올바른 헤더와 콘텐츠를 제공하고이 매우 LWO 볼륨 사이트에 대해 정말 실용적인 것은 아니지만 (웹 서버 앞에 캐싱 리버스 프록시를 실행하는 것입니다 문제를 해결하는 실제 방법).

+0

그게 위대한 대답도하지만 Madara Uchiha가 내게 더 쉽습니다 :) – Anuj