2013-05-09 40 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