簡體   English   中英

將大數據存儲在會話變量中是一種好習慣嗎?

[英]Is it good practice to store large Data in session variable?

我目前正在編寫一個php站點,每次都需要查詢大量數據(大約4 - 5MB)。 我已經有一個會話,並且想問一下,如果將這些數據存儲在會話變量中的良好做法?

當前的計划是在數據庫中維護一個表,其中包含表最后一次更改的時間。 如果該時間戳更新,那么將再次查詢數據,如果不是,則使用會話變量的數據作為其仍然一致...

這是避免查詢過多數據的好方法嗎? 當會話大小約為5MB時,網站會有什么樣的速度影響?

提前致謝!

這不是一個很好的練習(它會讓PHP咀嚼的內存遠遠超過實際應用),但我不確定它會如何影響性能。

我想真正的問題是:為什么你需要在會話中存儲這么多? 如果它是在會話之間可以訪問的信息,那么您應該將其存儲在數據庫中並“按需”加載它。

如果它是僅在會話有效時才相關的二進制數據(圖像,文件等),則將其存儲在用戶的臨時文件中(查看tempnam()sys_get_temp_dir() ),然后將臨時文件名存儲在會議。

不,這樣做並不好。

需要考慮的要點:

  • 通過defailt,會話數據存儲在臨時文件夾中的磁盤上。 每次調用session_start() (即每個頁面加載)時,都必須將整個數據加載到內存中並將其填充到會話數組中。 如果您正在加載大量數據,則可能會影響性能。

  • 此外,由於每次都要加載這一大塊數據,這意味着每個頁面加載會占用更多內存。 這樣可以減少服務器可以支持的並發用戶數。

  • 如果您正在執行此操作以緩存數據庫,則可以使用更好的解決方案。 與您提出的自定義編寫解決方案相比,APCu,Memcache,Redis和其他人都可以更好地緩存數據。 還有一些包裝庫可以使它更容易,並允許您在緩存解決方案之間進行混合和匹配。 如果您使用的是Laravel或Symphony等框架,則可能會在框架中內置緩存類。 或者,您可以嘗試像phpFastCache這樣的獨立庫。 但是,不要忘記現代數據庫引擎內置了自己的緩存機制,因此無論如何,對相同或類似查詢的重復調用應該相當快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM