[英]Large PHP session slowing down web application
我有一個Web應用程序,其中復雜的權限確定用戶是否可以訪問數千個不同文件中的每一個。 用戶可以查看所有文件,但有一個指示器可以打開他們有權訪問的文件。 如果用戶中的其他人可以訪問該文件,或者他們與之合作的某人擁有該文件的共享訪問權限,則該用戶可以訪問該文件。
現在,我有一個復雜的PHP函數,通過構建用戶可以訪問的文件數組(在組織或協作中)以及合並這些訪問數組來生成大型PHP會話。 當這些文件顯示給用戶時,PHP會檢查此數組以查看它們是否具有訪問權限,如果有,則會添加按鈕以打開該文件。 我這樣做是因為運行查詢以檢查每個單獨文件的訪問權限,在顯示長文件列表時最終會占用太長時間,並且PHP的in_array()速度要快得多。
問題是...
php會話已經變得如此之大以至於它似乎正在減慢簡單網站功能的速度,我需要考慮一種新方法來實現這一目標。
我的問題是......
替換PHP會話以存儲用戶有權訪問的數千個文件的文件權限和文件位置的最佳方法是什么,以便在顯示文件列表時,PHP可以快速檢索此信息,而無需運行查詢對於每個單獨的文件?
嗯,在不知道問題的全部范圍的情況下,我建議在數據庫中添加一個Sessions
表,並包含一個FilePermissions
字段和一個UserId
字段。
該字段將存儲權限結構的json表示。 這只需要對數據庫進行一次調用,並且大部分處理將在解析json數據服務器端時進行(根本不應該有很多開銷)。
這是減少客戶端會話信息大小的標准方法。 一個好的經驗法則是在Sessions
表中放置任何公開應用程序邏輯的東西。
更新
我只會存儲, 他們必須在JSON現場訪問的文件。 可以假設不存在禁止他們訪問文件。 這將再次降低性能足跡。
只有在沒有復雜的權限結構時(例如每個文件都具有讀寫權限),這才有效。 如果沒有,我會說你很清楚。
我不確定你能做多少。 也許memcached
可以提供幫助,但我沒有使用它(盡管,從我所聽到的,這就是它的用途)。
您可以將數組保存在文件中,但據我所知,這正是會話的作用。
您還可以嘗試使用共享內存在腳本啟動之間將用戶數據保留在內存中。
您是否真的需要在一個陣列中使用用戶權限的完整列表? 也就是說,您是否總是向用戶顯示數千個文件? 如果是這樣,為什么? 是否有可能使用AJAX重新設計系統來懶惰地只獲取一部分文件?
更新:另一個想法。
您還可以為每個文件預先計算用戶的權限,並將其存儲在數據庫中。 表可以稱為FilesPermittedPerUser
並具有兩列主鍵userID / fileID
。 這將創建一個首先按userID
排序,然后按fileID
排序的索引。 雙列密鑰也會強制條目的唯一性。
由於它將由用戶編入索引,因此您可以簡單地按ORDER BY userID
和LIMIT 10, 10
來僅列出文件10-20。 通過AJAX獲取列表中的部分內容意味着您永遠不會導致腳本當前導致的可怕內存負載。
它只需要每當更新文件的權限時(例如,創建文件,刪除文件,更改組權限,更改用戶的組成員身份,更改文件的組成員身份......),您將不得不更新表格。 我懷疑這不應該太難。 只需確保在事務中執行緩存更新,以保持操作原子性。
您可能還希望在文件夾中組織文件系統。 向用戶扔掉大量文件並且必須始終維護它們是沒有意義的。 嘗試在Explorer / Finder / Nautilus上拋出10.000個文件,看看打開該文件夾時會發生什么。 什么都不好,他們可以保持記憶 - 而PHP則不然。
最后的想法(雖然你可能不必去這些極端):在非PHP的東西中重寫文件系統API並且可以保留權限數據。 僅使用PHP將請求轉發到在其他服務器上運行的自定義服務器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.