【问题标题】:Magento session doesn't get updated in event observerMagento 会话未在事件观察者中更新
【发布时间】:2015-03-06 06:50:42
【问题描述】:

我通过 ajax 请求设置了一个会话变量,就像在结帐页面中一样

Mage::getSingleton('customer/session')->setMyValue($value_from_post_data);

以上设置在自定义模块的控制器中。

我有一个事件观察者在这里观察 checkout_onepage_controller_success_action,当我访问会话时,我没有找到我创建的会话变量 my_value。

注意: 会话 ID 相同。他们没有变化。设置会话值后,我打印了整个会话数据以确认,setMyValue 在会话中创建了 my_value。

所以 ajax 请求已经完成了它的工作。它设置了变量 但是观察者会拾取旧的会话数据。为什么会这样,给我一个解决方法

这是 magento 中的错误吗?有没有一种方法可以让 magento 刷新会话对象。比如说,比如

Mage::getModel('core/session')->pleaseMagentoRefreshSessionObject();

这样我就可以在内存中获取新的会话对象了。

【问题讨论】:

  • 您能否也显示您在观察者中获取会话数据的代码?
  • 像往常一样,$data = Mage::getSingleton('customer/session')->getMyValue();该代码是专有的。事件名称是 checkout_onepage_controller_success。这是我获得会话值的地方。会话 ID 相同。会话变量是相同的。它只是缺少的那个特定变量
  • 我能建议的最明智的做法是使用标准 PHP 方式 ( $_SESSION ) 设置和获取会话变量,以确定它是否与使用 Magento 的 Singleton 有关
  • @jevgeni Bogatyrjov:我已经尝试过了。同样的事情发生了..会话被创建但不更新
  • 你试过添加 session_write_close();将值设置为会话后?

标签: php magento


【解决方案1】:

您可以在这里尝试一些事情。

1.)您的会话保存路径不可被服务器写入,这意味着它将为每个请求重新生成。你可以用一个小脚本来测试你的session_save_path是否可写:

<?php
    if ( !is_writable(session_save_path()) ) {
        echo 'Whoops, the session save path at "'.session_save_path().'" is NOT writable!';
    } else {
        echo 'The session save path at "'.session_save_path().'" IS writable, look elsewhere!';
    }
?>

显然,一旦您知道答案,您就可以根据您的服务器/平台采取必要的步骤。最常见的解决方法是在php.ini中设置session.save_path = "/tmp",然后重启apache。

 

2.)您的app/code/core/Mage/Core/Model/Session/Abstract/Varien.php 文件中出现了严重错误。从您的 Magento 版本的全新下载中获取干净的版本。

 

3.) 您的 AJAX 请求被重定向到 https:// 而不是 http://。使用 Web Inspector(或等效工具)跟踪请求并查找 302 重定向。如果你得到它们,请继续查看此列表。

 

4.) 您的 AJAX 请求不包含 Magento 期望的数据参数,即isAjax

jQuery.ajax({
    dataType: 'json',
    data: { 'isAjax': true }, // <-- set this value
    url: '//' + document.location.hostname + '/index.php/module/controller/method/',
    method: 'POST'
})
.done(function( json ) {
    var data = eval(json);
    jQuery('#div').html( data.content );
});

 

5.) 更多相同:您没有为 AJAX 请求定义 form_key。这是验证请求所必需的。

jQuery.ajax({
    dataType: 'json',
    data: { 'form_key': window.FORM_KEY, 'isAjax': true }, // <-- note the form_key
    url: '//' + document.location.hostname + '/index.php/module/controller/method/',
    method: 'POST'
})
.done(function( json ) {
    var data = eval(json);
    jQuery('#div').html( data.content );
});

全局 javascript 对象 window.FORM_KEY 由 Magento JS 提供,可在站点范围内访问。


狩猎愉快!

【讨论】:

    【解决方案2】:

    你所描述的听起来像一个会话写锁。 出于某种原因,某处 Magento(或 ZF/PHP)关闭了会话。如果您已将存储配置为将会话保存在文件系统中,它将获得写锁定。

    这是因为在该状态下,服务器可以将会话发送到网络套接字,因为它知道不会被重新/覆盖。在这种状态下,会话仍然存在于内存中,您仍然可以读取和写入会话对象,但它不会保存到文件系统中。因此,在一个新请求中,您会丢失在写锁之后写入的数据,这正是您的情况。

    一个非常简单的解决方法是将会话保存在数据库中。为此,请编辑您的“app/etc/local.xml”并替换:

    <session_save><![CDATA[files]]></session_save>
    

    为:

    <session_save><![CDATA[db]]></session_save>
    

    (之后清除“var/session”和“var/cache”中的所有文件)

    【讨论】:

      猜你喜欢
      • 2016-11-01
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多