微軟與開源乾貨對比篇_PHP和 ASP.NET在 Session實現和管理機制上差異

tianxiaoxu發表於2018-06-21
【本文轉自部落格園,作者:青春羅賓漢 原文連結:http://www.cnblogs.com/zyczyc/p/9194816.html】
前言:
由於開發人員要靠工具吃飯,可能和開發工具、語言、環境呆的時間比和老婆孩子親人在一起的時間還多,所以每個人或多或少對自己吃飯的工具在感性上帶有宗教情結,在理性上又受屁股決定大腦利益左右,這種比較一般都容易遭人爭議, 這些比較不帶任何偏見和感情色彩,主要是自己工作中記錄在有道雲筆記的經驗日記主要是給I自己學習備查用,寫得多了就有參考價值分享出來給需要的人參考,如果有任何爭議本人不作辯解。這隻代表本人自己的理解印象。
Session篇:
PHP預設使用檔案儲存session資料, asp.net 預設儲存在IIS程式記憶體中

PHP方式優點:穩定可靠不易丟失,nginx或apache伺服器重啟不影響session丟失,session穩定可靠。整過機制簡易透明,使用者可以直接刪除session目錄下的檔案讓session失效,可以方便地實現asp.net 很難實現的一些特殊需求,如需要在使用者的請求或系統某些事件發生後要讓指定的A使用者session失效,然後必須強制從資料庫讀最新記錄,假如有這一樣矛盾的效能最佳化場景設計:假如使用者表User有餘額欄位Balance, 要讓使用者A登入自己的後臺看到自己的餘額是最新的,而又不想每重新整理一次面就請求一次資料庫造成不必要的壓力,最好的做法是把某使用者的記錄實體儲存在Session當中,每次從Session中讀取自己的餘額欄位顯示,就不會給資料庫造成壓力,只有當餘額欄位 Balance變化後即時清除掉這使用者的Seesion然後強制讓他去讀最新的資料庫欄位,但當其它事件發生時如:其它使用者給A轉賬後要清除A的快取,系統發生的退款、扣款、獎勵到餘額引起餘額變化時要清除A的快取,由於php的透明機制直接刪除對應session檔案就可以,但用iis就很麻煩了,由於微軟偏向於session放在記憶體中,封閉成黑盒又沒提供對應操作介面就悲劇了,只有透過其他辦法曲線救國。
PHP方式缺點:效能欠佳不如儲存在記憶體裡快,而且產生大量的小檔案,反覆建立刪除 這些小檔案會造成磁碟碎片久而久之會拖慢整個磁碟的效能,產生大量檔案控制程式碼佔用作業系統檔案控制程式碼,進而影響效能,網站訪問量上升後是個悲劇,可能在一個目錄下產生數百萬個小檔案,即時執行在linux這樣一切皆檔案思想的作業系統上也是非常影響檔案系統效能,會嚴重拉低整個作業系統的磁碟效能。所以這個預設機制效能上不如IIS的預設儲存在程式儲存快。 那些神吹開源技術效能設計比windows先進的人自行打臉,最近深入瞭解lamp,lnmp後發現有很多過時的設計無法跟上時代,如php無法使用真正的資料庫連線池等很多比原本想像來嚴重得多的問題,當然 般都會有第三方非主流折騰代替的方案,如使用memcache記憶體方式儲存session在記憶體中也是可以的,但需要手工折騰一下。
PHP分散式session的支援:在高併發多臺伺服器負載均衡的環境中,兩臺nginx 或apache要共享session 一般是把session儲存在資料庫中,然後不同的負載主機共連一個資料庫來實現,資料庫的效能和讀寫檔案實際沒有本質區別,穩定性依然強,但效能依然是弱點
ASP.NET方式優點:速度快,不用讀寫磁碟顯然這是很自然的是
ASP.NET方式缺點:很不穩定,不要說重啟IIS網站這樣的極端操作會丟失Session,就算是改動了配置檔案 web.config或者變動了bin目錄下的dll導致網站重新編譯的操作都會重置記憶體導致Session丟失,這就是為什麼在asp.net 開始除錯期間常常遇到測試人員登入系統沒幾秒就可能session丟失的奇怪幻像,一般都是有程式設計師在頻繁更新程式,只要更新一次就全面丟失一次session; 微軟的解決方案也足夠簡單好用,使用一個獨立的ASP.NET State Service狀態服務程式來儲存session資訊,注意使用ASP.NET State Service後資料還是儲存在記憶體中,只不過是一個獨立的服務程式,預設透過監聽tcpip=127.0.0.1:42424埠跨程式通訊儲存資訊,
這樣就算IIS重啟也不會導致使用者登入session丟失,穩定性解決了,同時資料還是儲存在內在中速度效能遠高於php的檔案儲存方案。而且狀態服務每臺電腦都預設安裝,只需要啟動就行。方便性和效能已經甩下php不在一個級別了。
ASP.NET分散式session的實現:在高併發多臺伺服器負載均衡的環境中,兩臺IIS要共享session非常簡,只需要共同連線一臺狀態伺服器就可以共享session,透過簡單設定就可以讓狀態服務開啟遠端訪問功能。當然asp.net也是支援把session儲存到資料庫的,但很少有人這樣用沒有太大的理由採用這種方案。
SESSION管理總結:可以看到php和asp.net的session管理機制上走的兩個不同的哲學方向,php穩定易於實現、偏愛對硬碟儲存,微軟asp.net偏愛記憶體裡儲存,實現難度要高於php,這是是商業軟體和開源免費軟體比較典型的特徵,商業軟體一般實現一個各方面都要優於免費一點東西,封裝個黑盒給你直接用,但特殊的需求不方便搞。
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31137683/viewspace-2156470/,如需轉載,請註明出處,否則將追究法律責任。

相關文章