2012-08-13 57 views
0

我目前遇到一個關於性能更精確的巨大問題:通過大量的文件(+100.000)平坦會話文件夾上的大量I/O生成的負載。處理大量的會話文件與Apache2和PHP

sessionfiles/htdocs文件夾位於託管存儲上 - 兩個獨立的服務器(位於負載平衡器後面)通過​​nsf-mount使用這些文件(apache2),並且正在訪問相同的會話文件夾(以保持其持久性)一旦。

不幸的是,該項目是高度頻繁,併產生大量的會議文件。即使使用2小時的ans max_lifetime,我們也會生成+100.000個會話文件,這對於IO節點來說非常重要。

是否有可能動態地將這些會話拆分爲子文件夾?例如所有會話文件與sess_1 *到/ tmp/sessions/1,sess_2到/ tmp/sessions/2等等?採用這種方法,存儲/ IO節點只需要處理〜10.000個文件夾,這應該加速垃圾回收,並且應該防範IO負載。

,我發現,PHP(session.save_path的)文檔此摘錄:

http://de3.php.net/manual/en/session.configuration.php#ini.session.save-path

有一個可選的N參數來此指令決定了 數目錄級別的會話文件例如,設置爲'5;/tmp'可能最終創建會話 文件和位置,如 /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If。爲了 使用N,您必須在使用前創建所有這些目錄。在ext/session中存在一個小的 shell腳本來執行此操作,它被稱爲 mod_files.sh,其中一個名爲mod_files.bat的Windows版本。還請注意 ,如果使用N並且大於0,則自動垃圾收集 將不會執行,請參閱php.ini的副本以獲取更多信息。 另外,如果您使用N,請務必在「引號」 中環繞session.save_path,因爲分隔符(;)也用於php.ini中的註釋。

有沒有人已經實現了這之前在php中,並可以提供一些示例php代碼來處理使用此mod_files.sh子文件夾中的sessionfiles?

記錄不幸的是它很糟糕......

+1

不要讓會議在文件中使用Redis的或Memcached的 – 2012-08-13 13:13:57

+0

你引用很清楚的文檔解決了這個問題:。」設置到'5;/tmp'「,但是你可能想考慮使用除會話文件以外的其他東西, – Matthew 2012-08-13 13:14:24

+0

是否需要將會話存儲在文件中?因爲你可以將它們保存到memcache中。 – pomaxa 2012-08-13 13:15:12

回答

2

有時候解決方案比它初看上去更容易。不知何故,我認爲PHP必須處理和管理會話目錄樹的apache請求。然而,Apache會在會話之後自行完成:save_path已被更改。

1)調用這個(修改)腳本(http://snipplr.com/view/27710/modfilessh-php/)通過SSH一次:

* SH路徑/到/腳本/ mod_files.sh路徑/到/會話深度*(在我的情況:「 mod_files.sh的/ tmp /會話1" 屆新會話目錄樹

3)變化

2)雙檢CHOWN權利」。的save_path「到‘1;/tmp目錄/會話’

感謝您的幫助仍然

+0

不要忘記禁用內部垃圾回收並添加一個自定義的垃圾回收(例如使用模擬的cronjob),因爲如果您使用的是目錄樹,則不會執行自動垃圾回收。 – simplyray 2012-08-14 08:06:57