2011-09-14 46 views
0

我已經繼承了一個創建音頻播放小部件的php/js項目。這個要求的確是他們能夠在「高峯時段」承受相當沉重的負擔:當新的賽道首次被宣佈時,可能會有很多人一次衝過來玩。如何阻止我們的小部件在重負載下死亡?

不幸的是,在這樣的壓力條件下,小部件往往會做得非常糟糕。我們曾經考慮過,在SQLite數據庫中保存和查找訪問密鑰可能會導致致命的錯誤,因爲鎖定。在實驗上,我將訪問密鑰更改爲存儲在會話變量中,但我現在擔心這可能只是創造了一種新的瓶頸:每次請求都必須等待會話釋放才能繼續進行?

我下載了Pylot並做了一些基本的負載測試:它並不需要許多代理嘗試訪問相同的小部件,以使它出現故障或完全無法使用,可能是10或20個。理想情況下,我們希望能夠處理比這更大的流量。我可以明智地採取什麼策略來提出更多請求?

回答

1

一個基於PHP文件的會話將鎖定會話文件,直到腳本退出,或者調用session_write_close()。您可以快速執行session_start(); session_write_close()。 $ _SESSION數組仍然可用,但隨後的更改不會寫入磁盤,因爲PHP已被告知會話已關閉。

+0

我有session_start()在相關文件的開頭,我沒有任何session_write_close()發生。所以我應該在寫入變量之前和之後打開和關閉會話,然後在讀取之前和之後再次打開和關閉會話? – thesunneversets

+0

讀完後你可以隨時調用session_start()。並在session_close後繼續閱讀。關閉會話不會垃圾$ _SESSION,它只是告訴PHP現在將它寫出到磁盤上(而不是在腳本退出時再寫出來)。如果稍後在腳本中對會話進行了更改,則可以使用_start/_write_close對來包圍關鍵部分,或者在腳本將以其他方式退出之前執行一次 - 如果您不接受多個打開/關閉循環不必。 –

0

存儲會話到數據庫中,而在正支撐MVCC,如MySQL和InnoDB的後端數據庫上的具體會話ID wrtiing(主鍵即是),它僅鎖定。您可以通過改進它下面的文件系統來進一步優化。

這樣做你可能會遇到競爭條件,但不會鎖定。玩的開心!