2011-05-21 154 views
6

可能重複:
Can't pass mysqli connection in session in php存儲數據庫連接

我們很多人都寫了需要使用數據庫的PHP應用程序的;主要是MySQL,但我經常使用非常小的MS Access數據庫爲技術能力較差的人,所以他們可以下載一個調整他們/保存備份/等。 (無論這是否正確,我不知道)。

我注意到,很多時間都花在連接和運行一些相同的查詢上。正因爲如此,我有一個有趣的想法:存儲連接和可能的結果集,這些結果集在$_SESSION變量中通常是靜態的,以減輕用戶瀏覽網站時的負擔。

顯然這樣做需要很多考慮。像會話被銷燬時關閉連接這樣的事情只是一個開始。

我的問題歸結爲:這真的有可能嗎?如果是這樣,我應該知道什麼事情(除了session fixation,因爲它是它自己的問題,適用於所有會議)?

回答

10

即使你可以做到這一點(資源與數據),這是一個壞主意。您將得到許多併發的開放連接,這將極大地影響您的最大連接...特別是如果其生命週期超過100毫秒(取決於您的查詢)擴展到20分鐘或更長時間。在開放連接的情況下,像MySQL這樣的東西也不能正確地重置內存分配,整個系統會下地獄。簡而言之,除非您的代碼的唯一使用者是單個用戶,否則這不是數據庫的用途。

作爲替代方案,我強烈推薦專門設計用於減少數據庫負載和避免連接時間的高速緩存技術。使用類似於最簡單的memcached將大大提高性能,並且您可以精確指定有多少系統資源進入緩存 - 同時讓數據庫在需要時獲取數據至。

+0

我沒有想到連接問題。這就是爲什麼我問:) – steveo225 2011-05-21 00:49:52

+0

看看Memcached。我在沒有數據庫的網站上使用它...甚至讓我建立一個複雜的PHP頁面,並整天提供服務(無需重新渲染),它會被SVN簽入無效。 – 2011-05-21 00:54:13

11

無法存儲數據庫連接或結果集在會話中,這是因爲它們資源和:

某些類型的數據不能被序列化因此也就不能保存在會話。它包含資源變量或帶有循環引用的對象(即將對其自身的引用傳遞給另一個對象的對象)。

http://php.net/manual/en/intro.session.php

您可以提取設定成正常陣列的結果和存儲在任何其他變量的會話。無論如何,這將是一個相當典型的會話用例。只是要小心,不要在會話中存儲太多數據,因爲這可能會比從數據庫中獲取更多的資源。

+0

這應該是被接受的答案。 – 2016-10-20 21:11:58

1

你應該在某些配置文件中更好地使用它們。會議是針對特定會議,而不是針對全球。