2011-08-05 8 views
-1

현재 모든 PHP 스크립트가 들어오는 모든 URL을 처리하도록합니다. 이 PHP 스크립트는 URL을 파싱하고 해당 URL에 대한 특정 처리기를로드합니다. 이처럼 :URL 처리 - PHP 대 Apache Rewrite

if(URI === "/") 
{ 
    require_once("root.php"); 
} 
else if(URI === "/shop") 
{ 
    require_once("shop.php"); 
} 
else if(URI === "/contact") 
{ 
    require_once("contact.php"); 
} 

... 

else 
{ 
    require_once("404.php"); 
} 

지금, 나는이 실제로 매우 비효율적이고 내 사이트가 더 자주 방문한되면 불필요한 처리 능력이 많이 필요 위하여려고하고 있다는 것을 계속 생각. 내가 해당 URL을 많이 가지고 있기 때문에, 난 단지 정말 경우 변경을 만들고 싶어, 그러나

RewriteRule ^$ root.php [L] 
RewriteRule ^shop$ shop.php [L] 
... 

: 그래서 mod_rewrite를 아파치 내에서 그것을 아파치가 직접 PHP 스크립트를로드하지 왜 생각 그만한 가치가있어.

그래서 내 질문은 다음과 같습니다. 어떤 옵션이 더 효율적입니까?

Btw, 필자는 절대적으로 URL 스키마를 유지하고 실제 파일 이름 (something.php)을 통해 스크립트에 액세스 할 수 없도록하고 싶습니다.

+0

스타일 시트 및 이미지와 같은 정적 리소스를 어떻게 다루고 있습니까? PHP 스크립트를 통과하지 않는 한, 아마도 –

+0

@Pekka 일 것입니다. 일부 리소스는 로그인 한 사용자 만 사용할 수 있기 때문에 쿠키와 로그인 상태를 먼저 확인한 다음 제공합니다. 그들과 함께 readfile(). 그러나 실제로 문제에 대한 첫 번째 답변을 제공해 주셔서 감사합니다. – unicornop

+0

당신은'switch-case'를 사용해야 만합니다. –

답변

0

그래서, 여기에 내 질문입니다 (하나는 PHP에서 필요로 제거) : 어떤 옵션 (그렇지 않으면 효율성 현명하고) 더 나은 이유 ?

모든 자원은 당신이 당신의 의견에 말한대로, PHP를 기반 검사를 통해 실행하는 경우

일부 자원, 로그인 한 사용자 만 사용할 수 있습니다 그래서 쿠키를 확인하고 상태를 로그인 할 수 먼저 readfile()을 사용하여 서비스를 제공합니다.

실제로 PHP 측 로직을 사용하여 처리 할 수 ​​있습니다. 어쨌든 PHP 인스턴스가 시작되어 Apache에서 URL을 구문 분석하는 성능 향상을 크게 미치게 만듭니다. 가능하면 모든 리소스에 대한 별도의 PHP 프로세스를 시작 피할 때문에

어떤 세션이나 다른 PHP 측의 검사를 필요로하지 않는 정적 리소스가있는 경우, 당신은 절대적으로, htaccess로 파일의 라우팅을 처리해야합니다. 그러나 귀하의 경우에는 적용되지 않습니다.

일부 아이디어는 성능을 향상하기 :

  • 모든 자원 PHP 기반의 인증을 통해 보호 될 필요가 정말 여부를 고려. 성능 시트가 많은 PHP 프로세스를 저장하지 않고 스타일 시트 나 일부 이미지를 공개 할 수 있습니까?

  • 가능한 한 적은 파일로 리소스를 축소하십시오. 모든 스타일 시트를 하나의 이미지로 축소하고 CSS 스프라이트를 사용하여 이미지 수를 줄입니다.

  • nginx은이 특정 종류의 시나리오를 처리하는 것이 더 좋다고 들었습니다. 적어도 인증 확인이 완료된 후에 파일 배달을 매우 효율적으로 처리 할 수 ​​있다고 들었습니다. PHP의 readfile()에 의존하십시오.

+0

@unicorn 아무 문제 없습니다. 나는 비슷한 질문을 한 번 : [PHP 수준에서 파일을 보호하기위한 성능 지향적 인 방법?] (http://stackoverflow.com/q/1688568) 대답은이 문제를 해결할 실제 좋은 방법이 없다고 제안합니다. 퍼포먼스를 원하면 리소스를 대중에게 노출시켜야합니다. 보안을 원할 경우 매번 PHP 체크를 통해 요청을 실행해야합니다 –

0
RewriteRule ^([a-z]+)$ $1.php [L] 

index.phproot.php 이름을 바꿉니다.

+0

style.css를 style.css.php로 만들면 너무 좋지 않을 것입니다 ... –

+0

- [az] +는 그것과 일치하지 않을 것입니다 –

+0

다음 번에는 실제로 ** ** 질문을 읽으면 정말 좋을 것 같습니다. 이것은 답이 아닙니다./item/2839/page3과 같은 동적 URL을 사용하기 때문에 내 경우에는 한 줄을 사용할 수 없습니다. 필자가 제공 한 예제는이 질문에 대한 불필요한 소음을 모두 제거한 것입니다. – unicornop

0

PHP 접근법은 정확하지만 조금 개선 할 수 있습니다.

$file = $uri.".php"; 
if (!is_file($file)) { header("Status: 404 Not Found"); require_once(404.php); die(); } 
require_once($uri.".php"); 
+0

Jacek_FH의 답변 # 3에 설명 된 것과 같은 이유로 작동하지 않습니다. 다시 말하지만 내가 제공 한 예제 URI는 내가 사용하고있는 URI가 아니지만 누군가 실제로 질문을 읽는다면 문제가되지 않아야한다. – unicornop

+0

나는 당신의 질문을 철저히 읽었으며 나의 대답이 충분하지 않은 곳을 보지 못했습니다. 질문을 단순화했다고 생각한다면 실제 코드 예제를 게시하십시오. –

+0

그럼, 코드로/items/34893/page3을 어떻게 처리할까요? 내 (예 : substr (URI, 0, 7) === '/ items /'또는 preg_match)로 if 문을 사용할 수 있습니다. – unicornop

0

OK, 효율성 등 - 다른 사람과는 별도로

, htaccess로 - 하나의 정규 표현식 많은 htaccess로 규칙 또는 여러 PHP의 경우보다 빠른 것 파일을 일치의 로딩 정규 표현식과 PHP 버전 htaccess로 버전 그리고 PHP는 방법은 아마 htaccess로와 약간의 이득과, 그 경우 효율이 비슷해야

+1

나는 당신의 마지막 문장에 동의하지 않습니다. PHP를 사용하면 완전한 인스턴스를 시작하고, 메모리를 예약하고, 세션을 시작해야합니다.신중하게 사용하지 않으면 리소스 돼지가 될 수 있습니다. 현명한 경우, Apache의 논리를 사용하는 것이 가장 좋습니다. –

+0

하지만 php는 결국로드 될 것입니다. 두 경우 모두 하나의 PHP로드입니다. –

+0

은 요청 된 리소스가 정적 리소스 일 필요는 없습니다. (그 외, 당신 말이 맞습니다.) –

관련 문제