2009-06-03 2 views
0

직장에서 우리는 가벼운 무게와 지금까지 우리에게 큰 작품 가정 성장 템플릿 시스템이 있습니다.PHP 템플릿 루핑 결과

우리가 타격을 가하는 벽은 템플릿 위로 반복 할 수 있기를 원합니다. 유스 케이스는 검색 결과와 비슷합니다. 우리는 이것을 할 수있는 방법을 생각하려고 노력하고 있습니다. 우리는 지금 세 가지 방법을 생각해 냈습니다. 첫 번째는 좋은 예전의 html을 루프 안에 저장하고 그 위에 반복하고 concat을 사용하여 html에 변수를 넣는 것입니다. 우리가 생각한 두 번째 방법은 파일을 반복적으로 포함시키는 것입니다. 그리고 세 번째 방법은 파일을 한 번 포함하고 출력 버퍼링을 사용하여 출력을 캡처하고 텍스트 에코 "를 추가 한 다음 eval을 사용하는 것입니다. (내 상사는 창의적인 방법을 찾아야한다고 생각했습니다.)

글쎄, 나는 우리가 논리와 HTML을 완전히 분리 할 수 ​​있기 때문에 반복적으로 포함하는 방법을 선호한다 .eval 메서드는 또한 이것을 수행하지만 좀 더 hackish 한 것처럼 보인다. 루프 (방법 1) 안에 html 권리가있는 것이 가장 빠르다는 것을 알았고, 그 다음에 eval 메소드가오고 마지막으로 여러 번 포함되었습니다. 실제로는 eval 메소드보다 약 5-6 배 느립니다. (우리는 파일을 포함 시키거나 파일을 1000 번 평가 한 다음 그 결과를 얻으려고 100 번 시도하고 평균하여 결과를 얻습니다.)

다중 포함 속도를 높이는 방법이 있습니까? (include php가 파일 시스템을 다시 시작할 때마다 나타날 것입니다.)

아니면 이런 유형의 작업을 수행하는 방법이 있습니까?

+0

이것은 sprintf (% s, % d 등), file_get_contents()를 사용하여 포맷 된 HTML 청크를 얻은 다음 th 변수. – artlung

+0

PHP 참조 : http://php.net/sprintf – artlung

+0

@artlung : Ew, sprintf는 추악합니다! 왜 그걸하고 싶니? –

답변

0

최종 페이지를 캐시하십시오. 내가 말하고자하는 것은 모든 "블록"(루프, 조각, 원하는 것을 무엇이든)을 가져 와서 캐시에있는 하나의 PHP 파일에 결합시킨 다음 그 때부터 포함시키는 것입니다. 그렇게하면 요청 당 한 번만, 예를 들어 25 번 대신 파일 시스템에 도달하게됩니다.

0

이전 질문, 알아요.

어쨌든, 템플릿 내에서 for 또는 foreach 루프를 사용하는 것이 좋습니다. 거기에 아무런 문제가 없습니다. 첫째, 일부 프리젠 테이션 코드를 반복하는 것은 여전히 ​​내 눈에 프리젠 테이션 로직이기 때문에 (이것은 출력을 열에서 출력으로 변경하는 것이 더 쉬운 것처럼 행에서 출력합니다 - 바보 같은 예). 둘째, PHP는 여전히 템플릿 언어입니다. 템플릿에 간단한 컨트롤 구조를 사용하는 데는 아무런 문제가 없습니다. Smartys와 같은 시스템을 사용하면 또 다른 추상 구문을 추가하는 것만으로도 PHP의 강력한 기능을 사용할 수 있으므로 많은 오버 헤드가 발생합니다. 그건 내 눈에서 말도 안돼 (옆 자리에 : 나를 위해 그것은 inner-platform effect, 안티 패턴입니다).

+0

나쁜 생각은 아닙니다. 우리가 실제로 일을 끝내는 것은 PHP에서 내장 된 DOM 파서를 사용하여 파일에로드 한 다음이를 사용하여 각 사용에 대한 템플릿을 변경하는 것입니다. 큰 문제는 PHP를 사용하지 않고도 제어 구조가 없으며 최소한의 PHP만으로도 매우 깨끗한 템플릿을 만들고 싶었고 발생할 수있는 각 게시에 대해 변경할 수있는 것과 같은 높은 수준의 사용자 정의 가능성을 유지하고자했습니다. . – Boushley

2

테스트 결과에 따르면 스크립트를 최적화하는 가장 좋은 방법은 이미 포함 된 HTML 코드를 스크립트에 추가하는 것입니다.

충격 시간에서 유래 :)

  • 평가 (디스크 액세스) (
  • 포함 코드를 확인하기 위해 PHP 파서를 호출을 사용

각각 포함() 다음 성능 수치를 다운 그레이드 변경되지 않은 파일의 디스크이 디스크 액세스를 최적화하려면 eval() 옵션을 사용하십시오.

  • include() : intial-parser + [disk-access + parser] * N 루프;
  • 평가는() : 초기 파서

, 당신은 HTML을 포함하는 함수를 만들 수있는 깨끗한 코드를 유지하기 위해, 글로벌 사용 : 초기 파서 + 디스크 액세스 + 파서는 * N은

  • 인라인 HTML 루프 변수, 또는 HTML에 표시해야하는 모든 데이터가 포함 된 단일 객체 또는 배열 변수

  • +0

    우리의 발견을 잘 요약 해줍니다. 기능을 갖는 것이 좋은 생각입니다. 나는 정말로 우리가 생각한 똑똑한 무언가가 있었으면 좋겠다고 생각했지만, 나는 그렇지 않다. – Boushley

    +0

    phpBB에서 볼 수있는 다음 단계는 공통 섹션을 컴파일하여 캐시에 저장하고 몇 분 또는 변경 후에 업데이트하는 것입니다. 내 생각에 니가 타이밍을 잘 잡아 먹은 것 같아. –