多个实例随机注销用户
我在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
最后我已经成功调试了这个问题,这要感谢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)。
你只要求对如何调试的建议,所以你去:
- 为每个实例布局文件添加不同的隐藏字符串,以便您可以查看哪个实例为当前请求提供服务
- 检查浏览器的请求/响应头中的cookie以找出(如果使用e非常的要求,当一个新的服务器从你的服务器发回
这可能会帮助你找出在什么情况下会话丢失。
UPDATE
- 查明是否会真的破坏或者Yii的只是将您注销。为此,请以访客用户身份向会话写入内容,然后尝试在某些重新加载时丢失此信息。
- 禁用
allowAutoLogin
并查看它现在是否可用。
谢谢!我做了一些检查数据库中的cookie和会话会发生什么,并更新了问题。在Cookie标头中是否有任何您觉得奇怪的事情? – luttkens 2013-05-10 08:56:01
嗯。查看更新。看来会议不会丢失。你可以在你的数据库中进行验证。 – 2013-05-10 11:00:15
明白了!首先,我意识到,作为访客用户,会话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