2013-10-04 45 views
0

我有一個由HTML(AngularJS)客戶端和PHP後端組成的應用程序。客戶端和服務器之間的所有通信都使用XMLHTTPRequests完成(當然除了加載第一個HTML文件和靜態資源 - JS/CSS ...)。服務器公開一些API端點,客戶端向這些URL發出請求。一旦服務器收到請求,它會檢查$ _SESSION以檢查用戶是否已登錄。Apache2和PHP會話 - 它可能會導致隨機滑倒?

我的問題是,幾乎每個請求都可能從$ _SESSION讀取(不寫入)可能導致響應中的主要掛起?例如,該應用程序適用於多個請求,然後發送隨機請求並在數分鐘後收到響應(迄今爲止記錄爲15)。它似乎也是後來處理的請求(根據dummy error_log測試),所以減速並不是由我的代碼在PHP中的操作引起的。也許這是一個愚蠢的問題,但我已經加倍了Apache的ServerLimit(1000),但沒有運氣。我也有這個服務器上的另一個PHP應用程序,它可以正常工作,我可以想到的唯一區別是工作應用程序幾乎不檢查$ _SESSION與XMLHTTPRequests的組合。

PHP版本:5.3.3

+1

如何配置會話?他們是從文件,數據庫寫入還是讀取,還是有其他機制?如果您正在基於文件存儲讀取/寫入會話,則應用程序中出現的第一個減速是所有內容都將等待硬盤返回讀取信息。鑑於事實上大多數機械驅動器可以每秒執行300次這樣的事情 - 是的,很可能它不是您的軟件,而是硬件問題。 –

+0

感謝您的評論。它是基於文件的。我瞭解硬件限制,但不應該造成16分鐘延遲(希望),並且總體負載沒有服務器真的很低。 – ladar

+0

很難分辨究竟是什麼導致如此巨大的減速,它可能是您的代碼,可能是硬件故障,您必須檢查哪個進程需要花費很多時間才能完成並從中取出。祝你好運:) –

回答

1

我無法找到問題的具體原因,但如果你正在使用PHP的5.1.x它在session_start()加載到內存中的所有會話數據。由於整個服務器中的文件訪問將被延遲。

如果您的服務器php版本不是5.1,並且它是最新的5.4或.5,那麼可能出現的問題是由於創建了大量的會話臨時文件。

這有時會導致操作系統中的文件系統限制問題。所以您需要將會話時間設置爲較短的時間段。

同時讀取操作系統上會有很多負載。

這可以通過使用配置參數session.gc_maxlifetime

實現PHP運行在過期會話垃圾收集當前會話裝入,並使用session.gc_probabilitysession.gc_divisor它計算出的垃圾收集將運行的可能性之後。

因此,將會話最大生存時間設置爲最大1並查看性能。

由於這個原因,大多數Web應用程序提供了一個選項,稱爲記住我。

這些應用程序通常會替換session_start,並在用戶空閒特定時間段時強制執行超時。

希望這有助於

參考: -

Session time out best practices

Session Clustering White paper

+0

很多信息調查,非常感謝!我會試試看。 P.S .: PHP是5.3.3,我會更新這個問題。 – ladar

+0

如果我理解正確,我應該: - 在用戶登錄時使用session_start()一次 - 將session.gc_maxlifetime設置爲某個自定義值 - session.gc_maxlifetime之後,會話被銷燬,用戶將不得不再次登錄? 現在每個HTTP請求都會觸發session_start()調用,因此這不是最優的,對嗎? – ladar

+0

哦,是的,你不必每次都做session_start(),一次是足夠的,我想如果你每次用戶請求每個用戶時都繼續創建session_start,那麼它會創建一大塊會話臨時文件並減速到系統 –