2009-09-10 6 views
1

나는 MySQL에서 가져온 여러 가지 유형의 목록을 반복하여 Facebook - esque "피드"로 표시하는 기능을 가지고 있습니다. 각 유형의 목록은 모양이 다르므로 다른 템플릿이 필요합니다. PHP 템플릿을로드/포함하는 가장 빠른 방법은 무엇입니까?

function display_listing($id,$type) { 
    global $abs_path; 

    switch($type) { 

     case 'photo': 
      include($abs_path . '/templates/photo.php'); 
      break; 

     case 'video': 
      include($abs_path . '/templates/video.php'); 
      break; 

    } 

} 

내가 잠재적으로 (100)가 포함와 끝나지 않는이 할 수있는 더 나은 방법이 있나요 : 여기

은 아래의 기능 예 (100 개 옵션이있는 경우) 100 번 호출 할 수있다 - 내 처리 속도가 느려질 수 있니? 어떻게 든 페이지에 포함 된 것을 한 번만 저장하고 필요할 때까지 여러 번 참조 할 수 있습니까?

... 또는 이것이 가장 좋은 방법입니까?

또한, 나는 ... 템플릿 엔진없이, 내 자신에이 작업을 수행하는 방법을 알고

편집을 원하는 : 문제는 단지 include_once 문 (내가 믿는 해달라고) ... 내가 필요에 의해 해결되지 포함 된 파일을 여러 번 재사용 할 수 있으며 매번 변수를 바꿀 수 있습니다.

+0

'include_once 'file.php'; '? –

+0

당신이 그렇지 않다는 것을 알았지 만, 이것은 Smarty와 같은 템플릿 엔진이 노력할 가치가있는 경우입니다. (그리고 Smarty를 사용하는 데는 많은 노력을 기울이지 않습니다.) – Nate

+0

Nate, very understandable ... 사용하기 전에 멋진 일을 이해하고 싶습니다. – johnnietheblack

답변

2

스위치가이 코드를 작성하는 데 가장 확장 성있는 방법은 아니지만 템플릿을 별도의 파일로 유지하는 유일한 방법은 여기에 포함되어 있습니다.

/* 
photoTemplate.php 
*/ 

<?php 
function loadPhotoTemplate($id) { 
?> 
    <div id="photo"> 
... 
    </div> 
<?php 
} 
?> 


/* 
listing.php 
*/ 

function display_listing($id,$type) { 
    global $abs_path; 

    switch($type) { 

     case 'photo': 
      include_once($abs_path . '/templates/photo.php'); 
      loadPhotoTemplate($id); 
      break; 

     case 'video': 
      include_once($abs_path . '/templates/video.php'); 
      loadVideoTemplate($id); 
      break; 
    } 

} 

이 대부분 한 번에 각 템플릿 파일을로드 한 후 바로 기능을 템플릿을 표시 할 때마다 호출

당신은 생각할 수 있지만, 함수에서 각 템플릿의 코드를 캡슐화 할 수 해당 항목의 특정 데이터로

편집

아마 처음에 모든 템플릿 파일을 포함하는 것이 더 나은 것, 그럼 그냥 스위치에서 해당 함수를 호출합니다. PHP의 * _once() 함수는 호출 할 때마다 이전에 포함 된/필수 파일 목록을 참조해야하므로 느립니다.

+0

흠 ... 그다지 끔찍한 생각은 아닙니다 ... – johnnietheblack

+1

시작 부분에 모든 템플릿 파일을 포함하는 것이 더 좋을 수 있습니다. , 사용 여부에 관계없이 스위치에서 적절한 기능을 호출하면됩니다.이전에 포함 된 파일 목록을 참조해야하기 때문에 * _once() 함수의 속도가 느리기 때문에이 말을 들려줍니다. –

+0

좋은 지적. 잠재적으로 fopen 등을 사용하고 파일의 내용을 각각 변수에 저장하는 방법은 무엇입니까? 느린가? – johnnietheblack

0

include 대신 include_once 함수를 사용하려고합니다.

include_once 문() 문은 을 포함하고 스크립트를 실행하는 동안 지정된 파일 을 평가합니다. 이것은 include() 문과 유사한 동작으로, 차이점은 코드가 이미 포함되어 있으면 코드가 다시 포함되지 않는다는 점입니다. 이름에서 알 수 있듯이 번만 포함됩니다.

+0

잘 모르겠습니다. 그가 3 가지 사진 목록을 원한다면 어떻게 될까요? – Nate

+0

나는 asker가 포함 된 스크립트의 출력을 한 번만 요구하지 않고 여러 번 필요하다고 생각합니다. –

+0

아 쉬 * t, 그것보다 똑똑합니다. 내 마음은 어딨어 ... 고마워! – johnnietheblack

1

허용되는 템플릿의 배열을 만듭니다. 요청한 템플릿이 배열에 있는지보기 위해 함수를 사용 해보세요. 그렇다면 $ type 변수를 사용하여 파일을 포함시킵니다. 그렇습니다. 일반적으로 포함 파일 이름에 사용자가 제공 한 데이터를 사용하면 안됩니다. 그러나 알려진 값 배열에 대해 유효성을 검사 했으므로 안전합니다.

0

다른 키워드에 대한 스위치를 사용하여 템플릿을 포함하려는 경우 스위치에 $ template_filename과 같은 변수를 설정하고 스위치에서 이탈하면 다음과 같이 include를 수행해야합니다. 당신이 전혀 포함하여 사용하지 않을 경우

include_once("/templates/{$filename}.php"); 

는, 당신은뿐만 아니라

이 방법은 그러나 나에게 합리적인 것 같다 ... 템플릿 엔진을 사용할 수 있습니다.

+0

include_once를 사용할 때 함수가 첫 번째 패스에서 작동하지만 파일이 있음을 감지합니다. 이미 두 번째 패스에 포함되어 다시로드되지 않으므로 목록이 표시되지 않습니다. 첫 번째로로드 된 파일을 로컬에 저장하는 빠른 방법이 필요합니다. (내 생각 엔) – johnnietheblack

1

만약 당신의 걱정이 성능이라면, 나는 개인적으로이 루프에 전혀 빠지지 않을 것입니다.

목록에있는 항목이 작성된 것보다 자주 표시된다고 가정 할 때 항목이 만들어지면 HTML을 생성하고 출력을 데이터베이스의 데이터와 함께 저장합니다. (또는 memcache 또는 파일 또는 다른 곳에서 -하지만 그것을 생성하고 그것을 저장하십시오.)

그래서 당신은 같은 논리를 다시 아이템의 생성 과정으로 옮겨서 switch 문장을 사용하지만 한 번에 하나의 항목 만 - 루프를 자르고 있습니다.

그런 다음 표시시 display_listing()을 호출하는 대신 이미 저장 한 HTML을 출력합니다.

+0

그래서, 내가 100,000 목록을 가지고 ... 그게 내 데이터베이스에 대한 스토리지의 톤을하지 않는 경우 하나의 외부 파일에 대한 템플릿이 더 시스템 친화적인가? 당신 대답에 뭔가 빠졌나요? – johnnietheblack

+0

스토리지가 정말 저렴합니다. HTML을 데이터베이스에 저장하지 않으려면 파일 시스템의 플랫 파일에 저장할 수 있습니다. 각 목록이 8KB의 HTML이라도 100KB 목록을 저장하는 데 1MB 미만입니다. 1 백만 개의 목록이있는 경우 여전히 10MB 미만의 저장 용량을 유지해야합니다. 대안은 한 번만 100k 목록을 생성하는 대신 각 목록 시간과 시간을 다시 생성하고 계속 작업을 버리는 것입니다. 'display_listing' 함수는 ID 인수를 취합니다. 이는 세부 정보를 얻기 위해 DB를 쿼리하고 있음을 나타냅니다. HTML 파일을 포함하면 비용이 더 많이 든다. – drewm

1

나는 몇 가지를보아야한다고 생각합니다. 첫째, 동일한 "템플릿"을 100 번 포함 할 가능성이 있습니까? 그것은 페이지에 담을 엄청난 양의 콘텐츠처럼 보입니다.

/* snippets.php */ 
function tableRow($row) 
{ 
    return 
     '<tr><td>' . $row['var1'] . '</td>' . 
     '<td>' . $row['var2'] . '</td></tr>'; 
} 

/* main page/view */ 
foreach ($data as $row) 
    echo tableRow($row); 

가장 큰 장점은 여기에 있습니다 :

나는 작은 "조각"을 사용하고있는 경우 -이 같은 문자열을 반환하는 함수를 사용하는 경향이 -, 여러 번 반복 것 테이블 행을 말한다 당신은 루프와 모든 종류의 함수를 가질 수 있습니다.

직선 변수 대체를 찾고 있다면 HTML 파일에 고유 한 미니 템플릿을 만들 수 있습니다. 같은 뭔가 :

다음 템플릿에서 읽을
<p>{name}<br /> 
    Posted {date} by {author}</p> 

, 모든 {변수}에 str_replace를 실행하여 display_listing 기능에 전체 문자열을 전달합니다. 퍼포먼스 히트가 너무 많을 것이라고는 생각하지 않지만 확실하게 시도해야합니다.

+0

동의합니다. 내 유일한 제안은 HTML을 인라인하지 말아야한다는 것입니다. 한 번 읽을 수있는 별도의 템플릿 파일을 만든 다음 루프 반복마다 문자열 교체를 수행하는 것이 가장 좋습니다. 그런 다음 실제 템플릿 엔진으로 이동하기 시작했습니다. 어쨌든, 파일 시스템에 읽기/쓰기를 포함하는 모든 작업은 비용이 많이 들기 때문에, 이와 같이 뭔가를 상당히 빠르게해야합니다. – sparkey0

+0

@sparkey : 정확히 말했던 것입니다. HTML 파일을 문자열로 읽어 들여 변수를 바꾸는 함수에 문자열을 전달합니다. – DisgruntledGoat

관련 문제