【问题标题】:Yii2 share session between 2 appsYii2 在 2 个应用程序之间共享会话
【发布时间】:2015-09-14 17:56:46
【问题描述】:

目前,我的应用程序具有以下结构:

  • 前端
  • 后端(用户认证)
  • 客户端(用户认证)

我正在尝试将一条 Flash 消息从客户端传递到前端

在客户端应用程序中,我简单地设置了闪光灯:

Yii::$app->session->setFlash('successMessage', 'My success message!');

在前端:

Yii::$app->session->getFlash('successMessage');

但上述显然行不通。

我已经尝试在两个应用的 config/main.php 中设置相同的会话 id,但似乎没有什么不同:

'components' => [
    'session' => [
        'name' => '_mySharedSessionId',
        'savePath' => __DIR__ . '/../runtime',  
    ],
    ...
]

任何想法我错了吗?

更新 问题可能来自我为每个应用程序设置了 4 个不同的虚拟主机:本地前端、本地后端、本地客户端。如果我将其恢复为默认值,一切似乎都可以正常工作。所以我现在的问题是: 是否有一种通用的方法可以在上述虚拟主机之间共享会话,以便在将网站上传到生产环境时它也可以在那里工作(可能生产环境中的 url 类似于 www.mysite.com、www.client.mysite.com , www.admin.mysite.com)?

【问题讨论】:

  • 您使用了多少个域?如果您在不同的域上运行,我不确定您是否可以共享会话。
  • 检查您的应用程序之间的会话 cookie 是否匹配。
  • 实际上,问题在于我为每个应用设置了不同的虚拟主机:本地前端、本地后端、本地客户端。如果切换回默认本地主机,一切似乎都可以正常工作。我会更新我的问题。

标签: php session yii2


【解决方案1】:

在您的controller 文件中添加以下代码

Yii::$app->session->setFlash('delete', "Member Deleted Successfully.......");

并在您的viewindex 文件中添加以下代码

<?php if (Yii::$app->session->hasFlash('delete')): ?>
   <div class="alert alert-danger alert-dismissable">
      <button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>
      <h4><i class="icon fa fa-check"></i>Deleted!</h4>
      <?= Yii::$app->session->getFlash('delete') ?>
   </div>
<?php endif; ?>

【讨论】:

    【解决方案2】:

    如果你想将会话从一个应用程序共享到另一个应用程序而不妨碍应用程序的域配置,那么你应该尝试 memcache!

    【讨论】:

    • 能否请您详细说明您的答案,添加更多关于您提供的解决方案的描述?
    • 如果你有多个应用程序,你可以使用memcache[d]。 Memcached 提供了一个会话处理程序,使用它您可以简单地使用从一个应用程序到另一个应用程序的会话。您可以参考以下链接:digitalocean.com/community/tutorials/…
    • 请注意,在 Memcache 中存储会话可能会出现问题。如果 Memcache 停止(无论出于何种原因),您将丢失其中的所有数据。您可能需要考虑将会话存储在数据库中,并将它们存储在 Memcache 中以加快进程。这样您就可以使用这些会话两个您想要的任何应用程序。
    【解决方案3】:

    问题出在您的 php 配置中,而不是 Yii2 特有的。您应该在 php.ini 中显式设置 session.cookie_domain 参数:

    session.cookie_domain = ".example.com"
    

    或者,您可以在 php 中使用 ini_set 执行此操作(例如,在您的 web/index.php 中):

    ini_set('session.cookie_domain', '.example.com' );
    

    默认情况下,该变量将 cookie 限制为当前域,但将其设置为 .example.com(注意点前缀)将允许对 example.com、www.example.com、foo.example.com 使用相同的 cookie , bar.example.com,但不是 example.org。

    专门针对您的本地安装,将虚拟主机更改为frontend.localbackend.localclient.local,并将cookie_domain 设置为.local

    【讨论】:

    • 正如我在问题的更新部分中所写,问题来自 vhosts 格式。现在我正在寻找一种通用的共享会话方法,它不会在生产中影响域配置。 (对不起我的英语不好)
    • 但这就是整个想法 - 您配置 php 以将来自不同域的 cookie 视为来自一个域。那并将cookie存储在数据库中应该可以解决您的问题。
    猜你喜欢
    • 2014-09-30
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2016-10-11
    • 2012-05-04
    • 1970-01-01
    相关资源
    最近更新 更多