我在多个前端/应用程序服务器环境中使用 Laravel(即负载均衡器后面的两个 Web 服务器)。
我正在调试一个问题,即 Laravel 应用程序在向服务器发出几次请求后丢失其 session 数据。我们将数据库 session 与单个 MySQL 数据库实例一起使用。
我注意到每次重新加载页面时,laravel_session
cookie 都会发生变化。一页一页刷新看起来像这样
eyJpdiI6I-mRudUNnM0ZpQzdxYmNyaWw0d21nWFE9PSIsInZhbHVlIjoiazVDQTVuZ0IzYUg5V0l3czBxaFl6bFRrXC9aTjFmT0VBeGVDYXg1REZQM2pIS1U0U1JCSVVreHprYU44ZjhKQTU4OTVUUGxpXC9qbWZpd0FcL2NtXC9ST25B-PT0iLCJtYWMiOiJ-hZWYxNTU4MDY0ODQxODViNDRjMjQzZGE1ZDQwZDA0YzQ0ZDY1YjE3YWE3YTc3ZjcwNTg4NGE3NDhhMWMzMGU0In0
然后再次重新加载页面,看起来像这样
eyJpdiI6I-nFjRjN1TGp0Q3Z3VmlrOG1PQlwveDF3PT0iLCJ2YWx1ZSI6IkVRYkpuWXFIVms5YnBwRXU2b1wvMFZSbW14RkVTZm8yVEpnaHRiOEhpWnlJWm9OM0JRR1wvYUI1VWhmeGYxQm0yaEFrc25PZUVcL3NSZ0RtUytzWHR3THp3-PT0iLCJtYWMiOiJ-jNTQ1YjM0MTkwZDVmM2RlMTAxYmNkMjAzMTY1NzVjMDExNTkxODAyZDM0YmQ5ZTk5NzFiNmY1YjQxYzE3ZjY1In0
-
是我添加的内容,旨在表明有些部分保持不变。
问题:
更改 session ID 是 Laravel 的标准行为吗?Laravel 4.2 数据库 session 可以在多前端 Web 服务器环境中开箱即用吗?
session 实现位于 Laravel 核心的哪个位置,以便我可以自己查看它?
回复:#1,根据 ceejayoz ,laravel_session
cookie 在每次服务器请求时都会重新加密,并且这种加密包括一点随机化——这意味着不断变化的 laravel_session
值是标准的 Laravel 行为。
最佳答案
这可能有多种原因,但最有可能的原因是您的负载均衡器将您定向到另一台不知道您的 session ID 的服务器,因此为您生成一个新 session 。
解决这个问题的方法是使用共享 key 存储,如 redis 。 Laravel 有 native support for redis ,因此无需花费太多精力即可启动并运行它,然后您的 session 缓存将在您的应用程序之间共享。 Redis 性能非常好且易于设置,因此您的服务器不会因它而严重重载。您可能需要根据高负载下的 session 数量考虑升级 RAM。
当然,您也可以将 session 缓存目录移动到网络共享。这可能是低效且浪费精力,但你的竞争对手会开怀大笑;)
编辑:还要确保两个应用程序具有相同的加密 key 。
关于php - 水平扩展环境中的 Laravel 数据库 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28158072/