2010-02-06 70 views
7

我使用session數組從數據庫中檢索的信息緩存塊:會話超載 - PHP中會話中存儲的「太多數據」是什麼?

$result = mysql_query('select * from table'); 
array_push($_SESSION['data'],new Data(mysql_fetch_assoc($result))); 

我的問題是,是否有限制/可/應圍繞在會議通過的信息相當大的量?這是不是很好的建議或顯着的性能阻礙?

+0

只檢查是否使用數據庫存儲會話檢查列的數據類型和長度 – 2017-09-13 01:01:18

回答

6

默認情況下,$ _SESSION數據存儲在服務器的/ tmp目錄中的磁盤上。只要你有足夠的空間,你沒有達到你的PHP內存限制,你就沒事。

但是,如果你試圖緩存查詢是相同的用戶數量較多,您可能需要使用類似的東西是不依賴於個人用戶APC或內存緩存。否則,您將基本上爲每個用戶緩存相同的結果1x,而不是在所有用戶中使用緩存。

0

由於會話數據在服務器上存儲在一個文件(或數據庫記錄),它不應該太大的關係多少數據你在其存儲。我只是建議反對巨大的物體。

你可能想看看APC或memcached的緩存結果,而不是,因爲它不是每個用戶的緩存,它使用的內存,而不是文件。

0

會話被序列化並寫入默認磁盤,所以根據大小和用戶的事情會變慢量。但是,這兩件事情都可以改變(閱讀http://php.net/session的會話手冊瞭解所有細節),比如使用memcache進行數據的內存存儲。最好的辦法是在儘可能類似於現場系統的環境下進行測試,並檢查產生的負載和吞吐量。

1

我認爲答案取決於您存儲數據的位置以及您可以在那裏轉移的速度。

如果數據是44 MB大,你是一個1000BASE-T網絡上,你可以預計需要1秒鐘,居然有轉移。和1秒轉回..

如果使用本地內存,那麼你的內存有限數量的機器。

如果你使用磁盤,那麼你有加載/保存時間(磁盤緩慢)。

但是請記住,PHP具有有限的內存量,它允許腳本使用。我認爲默認設置是8 MB。

如果你在談論大數據塊,你可能要考慮Redis,或其他鍵/值存儲。或者甚至是一個後端接口來操作數據/緩存它,而無需通過PHP進行傳輸。

0

嗯,棘手。我想你可以在會議中保存它。真正的問題是:你是否希望每當客戶發出請求時,所有這些信息都會序列化和反序列化? 如果您將在網站的每個頁面中使用所有信息,我認爲將它保存在那裏是可以的,但這是不可能的。如果將這些信息保存在/temptables/sometable/之類的目錄中,並且每個文件都有會話的名稱,會更好。您可以使用session_id得到它,並保存在你有使用的頁面加載信息:

$info = unserialize(file_get_contents('/templatebles/sometable/'.session_id().'.ser')); 

,並節省:

file_put_contents('/temptables/sometable/'.session_id().'.ser'), serialize($info)); 

但你需要一個cron工作以清潔工作舊文件的目錄。你可以通過文件名獲得會話,並使用session_start()或者像file_exists(session_save_path().'/sess_'.$session_name)這樣的方式來請求一些變量,比如'itsalive',以檢查是否應該刪除臨時文件。