2013-10-11 30 views
2

我來自桌面開發,我習慣在計算機的內存中看到我的應用程序,直到它被用戶終止。但對於PHP,每次向服務器請求新頁面時,我們都必須重新構建所有環境(類,對象,數據庫連接等)。我們在$_SESSION數組中存儲了一些變量,以便在用戶通過身份驗證時保持用戶登錄。

如果在用戶認證之後,我把application對象(以及其他創建的應用程序放入當前會話的其他對象,這樣解釋器不需要在每個請求上重新加載所有內容),如果它是好的理念,不僅是一個很好的,如果我的服務器專用?

我不認爲它不會讓響應速度更快,並且還更少的內存消費者。

<?php 
    // if user and password match: 
    session_start() 
    $_SESSION['Application'] = new TApplication('index/index'); 
    $_SESSION['Application']->SetUser($userName); 
    $_SESSION['Application']->ConfigureUserPermissions; 
    $_SESSION['Application']->RUN; 

<?php 
    // any request after user is logged and application is set: 
    session_start() 
    if (isSet($_SESSION['Application']) && (!$_SESSION['Application']->GetUser = null)) 
    { 
     $_SESSION['Application']->ExecuteAction($_GET['url']); 
    } 

我想知道這是否是:

  • 可能嗎?
  • 服務器內存殺手?
  • 更快然後通過閱讀我的MVC中的所有PHP文件重建應用程序?
  • 可靠的方法?
+0

據我所知,$ _SESSION變量在頁面瀏覽量之間被序列化爲磁盤,因此每次有新的請求時您仍然需要重建數據庫連接等。 –

+0

您應該嘗試它只有那麼你會發現爲什麼這種方法如此糟糕 –

+0

我的意圖是開發一個像Office應用程序包,許多應用程序共享數據庫中的類和表,包括用戶數據。 – PSyLoCKe

回答

5

簡短回答:不,這是一個壞主意。

擴展答案:

如何使你的會話獲得存儲取決於您的配置。默認情況下,它們通常存儲在一個文件中(每個唯一會話一個文件)。有時它們存儲在數據庫中。無論哪種方式,該存儲都是通過序列化$_SESSION中的所有數據開始的。

序列化相當快速,但不像執行實際源代碼那樣快。因此,讓您的整個應用程序的對象樹對每個請求重新進行反序列化和序列化,幾乎肯定會比執行應用程序更慢。所以,出於性能原因,你不應該這樣做。

序列化相對節省空間,但並不像源代碼那麼節省空間。所有的應用程序數據都將被序列化到磁盤,即使是每個用戶/會話都不會更改的數據。那麼,你在某個地方埋在課程中的國家代碼清單?序列化。你用來處理上傳的MIME類型的擴展地圖?序列化。你最終會得到大量的數據,這些數據很快就會佔用磁盤空間,因爲它基本上被複制到每個會話中,而不是在應用程序中只存在一次。由於空間原因和會話可管理性原因,您不應該這樣做。

只有某些類型的數據可以被序列化。任何指向資源的東西,比如數據庫連接,文件句柄等,都將無法序列化,並且在您反序列化對象後嘗試使用它時會中斷。出於兼容性原因,你不應該這樣做。

無論對象是否在會話中,都將使用內存。在會話中填充應用程序沒有任何好處。額外的序列化可能會導致內存使用量增加。

解釋並不需要在每次請求

重裝所有的東西這實際上不是一個現代的PHP環境(或網絡內置任何其他語言環境)如何工作。大部分(如果不是全部)源已經預加載。我認爲你低估了環境快速執行代碼的能力。反對解釋器和網絡服務器通常是一個壞主意。對大量數據進行序列化和反序列化通常比再次執行所有代碼要昂貴得多。

會話存儲並不是很便宜。最好只放置處理當前會話所需的數據,而不需要更多,從而保持較低的序列化成本。如果計算某些數據的速度很慢,並且您不希望每次重新計算一次,那麼一定要找到一個地方來存儲它,並且不要每次重新計算它。如果它的用戶數據,應該可能在數據庫中。如果它的具體到會話,當然,將它放在$_SESSION很短的一段時間,但理想情況下,你只有幾個小鍵$_SESSION指向數據庫或其他地方的記錄,更有效地保存大量的數據。

相關問題