2011-08-05 82 views
-1

目前我讓一個PHP腳本處理所有傳入的URL。這個PHP腳本然後解析該URL並加載該URL的特定處理程序。就像這樣:URL處理 - PHP與Apache重寫

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"); 
} 

現在,我一直在想,這實際上是非常低效的,打算一旦我的網站被訪問更多的時候需要很多不必要的處理能力。所以我想,爲什麼不mod_rewrite的內阿帕奇做到這一點,讓阿帕奇直接調用PHP腳本:

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

但是,因爲我有很多這些網址的,我只是想做出改變,如果它真的是值得。

所以,這是我的問題:什麼選擇更好(效率明智和否則),爲什麼?

順便說一句,我絕對想保持URL方案,而不是簡單地讓腳本通過他們的實際文件名(something.php)訪問。

+0

你是如何處理樣式表和圖像等靜態資源的?只要那些不通過PHP腳本,它可能是好的 –

+0

@Pekka,他們是,因爲一些資源只能登錄用戶,所以我先檢查cookie和登錄狀態,然後我服務他們與readfile()。但是,謝謝你真正爲我的問題提供了第一個真正的答案。 – unicornop

+0

順便說一句,你應該使用'switch-case' –

回答

0

所以,這裏是我的問題:什麼選項是更好(效率明智和以其他方式),爲什麼?

如果每個資源具有通過一個基於PHP檢查運行,爲您在您的評論說:

一些資源僅適用於已登錄的用戶,所以我去檢查的cookies和登錄狀態首先,我用readfile()來爲他們服務。

那麼你確實可以使用PHP方面的邏輯來處理事情:無論如何將開始一個PHP實例,這使得解析Apache中的URL的性能改進很大程度上沒有實際意義。

如果您有做需要的任何會議或其他PHP側單向靜態資源,你絕對應該處理路由在.htaccess文件如果可能的話,因爲你避免啓動爲每個資源單獨PHP的過程。但在你的情況下,這不適用。

一些想法,以提高性能:

  • 考慮每一個資源是否真的需要通過基於PHP的認證保護。可以將樣式表或某些圖像不公開,從而節省性能密集型PHP過程?

  • 嘗試將資源縮減爲儘可能少的文件,例如,通過將所有樣式表縮小爲一個,並使用CSS精靈來減少圖像的數量。

  • 我聽說nginx更好地準備好處理這種特定的情況 - 至少我被告知它可以非常有效地在驗證檢查完成後處理文件的交付,而不必依靠PHP的readfile()

+0

@unicorn沒問題。我曾經問過一個非常類似的問題:[以性能爲導向的方法來保護PHP級別的文件?](http://stackoverflow.com/q/1688568)答案表明,沒有真正的*好方法來解決這個問題 - 如果你需要性能,你必須公開你的資源,如果你想要安全性,你必須每次通過PHP檢查運行請求 –

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

並重命名爲root.phpindex.php

+0

太糟糕了,它會使style.css到style.css.php以及... –

+0

它不會 - [az] +不會匹配它的點 –

+0

下一次,如果你真的**閱讀**問題,那將會非常好。這不是一個答案。而且你的單行不適用於我的情況,因爲我使用動態網址/ item/2839/page3。我提供的例子只是我正在做的一個精簡版本,沒有解決這個問題的所有不必要的噪音。 – 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

因爲我在第3條評論中向Jacek_FH的回答中解釋了同樣的原因。再一次,我提供的示例URI不是我正在使用的,但如果有人真的閱讀了這個問題,那應該不是問題。 – unicornop

+0

我已經仔細閱讀了您的問題,但無法看到我的答案不足。如果您認爲您的問題過於簡化,爲什麼不發佈更實際的代碼示例? –

+0

那麼,如何處理/ items/34893/page3與您的代碼?我可以和我一起使用(例如,使用substr(URI,0,7)==='/ items /'或preg_match的if語句)。 – unicornop

0

OK,至於效率 - htaccess的版本與正則表達式和PHP版本,單正則表達式和匹配的文件會比許多htaccess的規則或許多PHP如果更快的加載 - 否則

除此之外,htaccess的和PHP的方法應該是,在這種情況下效率相似,可能與htaccess的小增益(消除PHP的一個要求)

+1

我不同意你的最後一句話。使用PHP,必須啓動完整的實例,保留內存,啓動會話等。如果不小心使用,它可能會成爲一種資源。在合理的地方,最好使用Apache的邏輯。 –

+0

但php將在最後加載 - 這是兩種情況下的一個php加載 –

+0

如果請求的資源是靜態的,則不一定。 (除此之外,你是對的。) –