2013-05-09 116 views
1

我在Appfog上運行Yii-app。每當我嘗試超過1個實例時,都不再可能保持登錄狀態。多個實例隨機註銷用戶

我知道多個實例需要會話的共享存儲,並且我已經使用EDMSHttpSession實現了該實例。它在本地主機上工作,也就是我可以登錄,重新啓動Apache並保持登錄狀態。另外,如果我刪除數據庫中的會話記錄,則會退出。這讓我得出結論,PHP正在使用數據庫來存儲會話。

我不明白爲什麼我的共享存儲會話不適用於Appfog和我想就如何進行調試提出建議。

一些更多的背景信息:

  • 我使用Cookie來實現自動登錄。他們應該有效30天(和 他們是根據Chrome檢查員),但從來沒有更多 然後幾個小時(瀏覽器會議我猜) - 不在本地,不在 Appfog。
  • 隨着多個實例和自動登錄啓用(即我點擊「記住我」),我仍然被隨機踢出去,通常在2或3頁刷新後。據我瞭解,無論服務器會話如何,cookie都應自動在 中籤名。
  • 在Appfog上,我有一個SSL端點,我不在本地主機上。
  • 我已簽上Appfog我的共享會話存儲越來越新的會話(尋找數據庫中的表)

更新:

我做了一些測試,也許我的結果將使SENCE到有一個。

我清除所有Cookie並重新啓動我的Appfog應用程序。我登錄並檢查 「記住我」。現在以下響應的Set-Cookie標題有:

Set-Cookie:PHPSESSID=vrfoi0o15v3qps2644uqtvkfa1; path=/ 
Set-Cookie:PHPSESSID=db38s1k1vp5ngll837ac0vh0u7; path=/ 
Set-Cookie:73dfaf673b71b1f92d34b8ab63dab17b=812bbcfd4f5b3be91f8c85d39c3b37bb93e4c6b8a%3A4%3A%7Bi%3A0%3Bs%3A24%3A%225087ea0b3145a75545000000%22%3Bi%3A1%3Bs%3A22%3A%22demo%40playbackenergy.se%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A0%3A%7B%7D%7D; expires=Sun, 09-Jun-2013 08:32:24 GMT; path=/ 

在隨後的請求的請求Cookie的標頭是:

Cookie:PHPSESSID=db38s1k1vp5ngll837ac0vh0u7; 73dfaf673b71b1f92d34b8ab63dab17b=812bbcfd4f5b3be91f8c85d39c3b37bb93e4c6b8a%3A4%3A%7Bi%3A0%3Bs%3A24%3A%225087ea0b3145a75545000000%22%3Bi%3A1%3Bs%3A22%3A%22demo%40playbackenergy.se%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A0%3A%7B%7D%7D 

我用"db38s1k1vp5ngll837ac0vh0u7"找到我的數據庫會話。該行看起來是這樣的(注意vrfoi0o15v3qps2644uqtvkfa1沒有在數據庫中找到):

{ 
    "_id" : ObjectId("518cb0981045979e06000000"), 
    "data" : "73dfaf673b71b1f92d34b8ab63dab17b__id|s:24:\"5087ea0b3145a75545000000\";73dfaf673b71b1f92d34b8ab63dab17b__name|s:22:\"[email protected]\";73dfaf673b71b1f92d34b8ab63dab17b__states|a:0:{}73dfaf673b71b1f92d34b8ab63dab17brole|s:4:\"demo\";", 
    "expire" : 1368176186, 
    "id" : "db38s1k1vp5ngll837ac0vh0u7" 
} 

現在我再重新啓動我的Appfog的應用程序,並嘗試導航到另一個網頁在我的app.Now我就會退出。

重定向請求之前,Cookie的頭到登錄頁面是(同前):

Cookie:PHPSESSID=db38s1k1vp5ngll837ac0vh0u7; 73dfaf673b71b1f92d34b8ab63dab17b=812bbcfd4f5b3be91f8c85d39c3b37bb93e4c6b8a%3A4%3A%7Bi%3A0%3Bs%3A24%3A%225087ea0b3145a75545000000%22%3Bi%3A1%3Bs%3A22%3A%22demo%40playbackenergy.se%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A0%3A%7B%7D%7D 

回答

0

最後我已經成功調試了這個問題,這要感謝MichaelHärtl的建議。

我不得不修復兩件事情

1)保護/配置/ main.php

array(
    'name' => 'My App', 
    'id' => 'yourdomain', 
    ..., 
) 

如果你沒有這個,多個實例將具有不同的ID指定的應用程序ID 。由於Yii使用app-id的散列來爲會話變量添加前綴,因此它將在不同的實例之間共享 - 儘管您已共享會話存儲空間。這Yii文章更深入地解釋它:http://www.yiiframework.com/wiki/135/single-sign-on-across-multiple-subdomains/

2)使用CDN的資產與共享chaching。顯然,資產文件夾(例如3f4ad45)可能在此實例中有所不同,因此您必須使用共享存儲。我使用擴展名http://www.yiiframework.com/extension/s3assetmanager/來管理資產,而https://github.com/aarondfrancis/yii-CMemCacheSASL用於緩存(MemCachier)。

1

你只要求對如何調試的建議,所以你去:

  • 爲每個實例佈局文件添加不同的隱藏字符串,以便您可以查看哪個實例爲當前請求提供服務
  • 檢查瀏覽器的請求/響應頭中的cookie以找出(如果使用e非常的要求,當一個新的服務器從你的服務器發回

這可能會幫助你找出在什麼情況下會話丟失。

UPDATE

  • 查明是否會真的破壞或者Yii的只是將您註銷。爲此,請以訪客用戶身份向會話寫入內容,然後嘗試在某些重新加載時丟失此信息。
  • 禁用allowAutoLogin並查看它現在是否可用。
+0

謝謝!我做了一些檢查數據庫中的cookie和會話會發生什麼,並更新了問題。在Cookie標頭中是否有任何您覺得奇怪的事情? – luttkens 2013-05-10 08:56:01

+0

嗯。查看更新。看來會議不會丟失。你可以在你的數據庫中進行驗證。 – 2013-05-10 11:00:15

+1

明白了!首先,我意識到,作爲訪客用戶,會話ID在每次頁面加載時都被更改。我查看了標題,發現我的所有頁面都有'Pragma:no-cache'和'Cache-Control:no-cache,no-store,must-revalidate'。當刪除'no-store'時,會話ID保持不變,現在多個實例可以工作(幾乎現在我遇到了Yii的assets文件夾,每個實例都有不同的問題,並打破了JavaScript引用,但CDN應該解決這個問題)。 – luttkens 2013-05-13 06:23:20