2010-10-31 34 views
2

我有一個搜索頁面,允許用戶按各種類別(年齡,性別,國家,地區,種族等)過濾其他用戶。第一次調用搜索函數時,它會從數據庫中獲取每個類別的所有可能值。只是想知道...PHP - 數據庫查詢或POST

每次重新加載頁面時(在序列化的隱藏表單字段中)將此數據返回,或每次加載頁面時都應從數據庫中檢索此信息是否更好?

如果我正確理解這種情況,序列化的POST選項會增加網站帶寬消耗,因爲數據從用戶計算機傳輸到服務器並再次返回到用戶計算機。另一方面,每次查詢數據庫都會增加服務器/數據庫的負載,但只能使用一半的帶寬。

如果是這樣的話,我該怎麼辦... 我知道它可能沒有太大的差別,我會得到的流量,但我想學習最好的方法做這樣的事情:P

回答

2

一般來說,我會一直把事情放在你自己的控制之下。這意味着將其保存在服務器和數據庫之間。

你要通過用戶的互聯網連接的速度,或網絡延遲等

另外,如果你想保持請求之間的事情,你有沒有想過使用會話或緩存中沒有控制?緩存(例如APC)允許您將數據存儲在服務器上以便下一個請求,因此它既不需要數據庫也不需要帶寬。

+0

謝謝......我前幾天在看APC,看起來非常酷。有計劃在網站的另一部分使用它,但沒有考慮在這種情況下使用它。可能看看:P – 2010-10-31 17:57:05

0

Facebook和許多其他公司僱用memcache存儲搜索結果並查詢此緩存,以便減少對數據庫的請求。

您可以將第一次搜索的搜索結果存儲在memcache中,並且由於這是隨後使用各種參數過濾的數據的超集,所有後續請求都將針對緩存而不是數據庫。

1

我認爲,「POST回來」的做法通常是不好:

  1. 這可能會導致安全問題

  2. 通常的數據庫和Web服務器之間的連接具有更高的帶寬,那麼之間的連接客戶端和網絡服務器

我建議要麼在Web服務器端使用數據緩存(請參閱其他答案的鏈接),要麼實現客戶端ide數據過濾/排序 - 必須有即可使用的JavaScript庫。

+0

感謝您的建議......您可以更多地瞭解POST數據的安全問題嗎? – 2010-11-01 22:44:23

+0

潛在的安全問題取決於實施細節。如果有一些處理來自用戶的序列化數據的服務器端邏輯,則此數據中的某些特定更改可能會中斷邏輯或超載服務等。如果用戶列表中存在某些控件,則用戶可能會生成無效的用戶名/ id,例如SQL注入。原理很明確:所有來自用戶的數據都必須經過驗證。數據來自用戶越多,您必須考慮的可能性越大,您必須實施的驗證越多 – Kel 2010-11-02 07:21:13

0

通過序列化你的結果並通過POST發送它們,你必須以某種方式將它們「打印」到你的表單中,這意味着它可以被鍛鍊,沒有它絕對不是一個可行的解決方案。

在memcache,APC等中緩存結果可能是一個很好的選擇。如果您不想或不能使用其中一種解決方案,那麼已經有數據庫引擎緩存可以爲您處理大部分的開銷。

最後一件事,搜索頁面應該根據HTTP/REST規範使用GET方法:POST必須用於插入,而GET必須用於檢索。