2012-04-05 89 views
1

我得到的Magento CE 1.6.1.0为什么Mage_Persistent断/ API/WSDL?肥皂

Warning: session_start() [<a href='function.session-start'>function.session-start</a>]: Cannot send session cookie - headers already sent by (output started at /home/dev/env/var/www/user/dev/wdcastaging/lib/Zend/Controller/Response/Abstract.php:586) in /home/dev/env/var/www/user/dev/wdcastaging/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php on line 119

内的下列错误访问/api/soap/?wsdl

显然当,一个session_start()正在尝试整个后WSDL文件的内容已经输出,导致错误。

为什么在输出所有数据后,magento尝试启动会话?我很高兴你问。所以看起来controller_front_send_response_after正在被Mage_Persistent吸引,以便调用synchronizePersistentInfo(),这反过来最终得到了session_start()

有趣的是,这不是始终发生,最初WSDL加载对我来说很好,最初我绞尽脑汁想看看我们的安装可能导致定制化,但我所做的追踪似乎表明,这一切都发生在核心内部。

我们也经历了一点点与Mage_Persistent的(完全不相关的)陌生感,这让我更愿意在这一点上抛出我的双手,因此它。

我已经做了一些搜索,并发现一些问题与整个“头已发送”的事情在一般情况下,但不是这个具体情况。

有什么想法?

噢,临时解决方法,我已经到位,只需通过persistent/options/enable配置数据禁用Mage_Persistent。我还做了一点挖掘,看是否有可能观察一个事件,以便为WSDL控制器禁用此模块只有(因为这似乎是唯一有问题的),但它看起来像模块完全依赖此配置标志来确定它的启用状态。

UPDATE:错误已被报道:http://www.magentocommerce.com/bug-tracking/issue?issue=13370

+0

Magento版本? Mage_Persistant是一个相对较新的功能,如果这个漏洞通过裂缝,它不会让我感到惊讶。 – 2012-04-05 19:11:52

+0

嘿,艾伦,啊,是的,很好的问题 - 我1.11.0 – kalenjordan 2012-04-05 19:58:39

回答

2

我报告这是Magento的团队中的错误。 Magento API控制器都通过标准Magento操作控制器对象进行路由,所有这些对象都继承自Mage_Api_Controller_Action类。这个类有一个preDispatch方法

class Mage_Api_Controller_Action extends Mage_Core_Controller_Front_Action 
{ 
    public function preDispatch() 
    { 
     $this->getLayout()->setArea('adminhtml'); 
     Mage::app()->setCurrentStore('admin'); 
     $this->setFlag('', self::FLAG_NO_START_SESSION, 1); // Do not start standart session 
     parent::preDispatch(); 
     return $this; 
    } 
    //... 
} 

包括设置一个标志,以保证正常的会话处理不启动对API的方法。

$this->setFlag('', self::FLAG_NO_START_SESSION, 1); 

所以,它听起来像有一个在synchronizePersistentInf代码,假定一个会话对象的存在,当它使用它的会话初始化,导致你见过的错误。通常,这不是一个问题,因为此时每个其他控制器都已初始化会话,但API控制器明确地将其关闭。

只要修复失败,您最好的选择(也许是您从Magento支持中获得的快速答案)将是禁用默认配置设置的持久性购物车功能,然后为需要的特定商店启用它它。这将让推车

自行解决问题将是一个未知的领域,我想不出一种方法来做到这一点,这不是非常不可靠或不稳定。最直接的方法是在synchronizePersistentInf上重写类,该类调用它的父方法,除非您检测到这是一个API请求。

+0

糟糕,对不起,我一直在ME 1.11.0做了很多工作,但有问题的实例其实是CE 1.6.1.0 - 我会想象尽管同样的根本原因正在发挥作用。 – kalenjordan 2012-04-06 15:04:13

0

此答案无意替代现有的答案。但是我想在这里放一些代码,以防有人遇到这个问题,并且评论并没有真正允许代码格式化。

我的Mage_Persistent_Model_Observer_Session简单local码池覆盖去退出该功能的任何URL路径是内/api/*

是不奢望此修复程序需要很长的寿命或升级型, b/c我期待他们在下一个版本中解决这个问题。

public function synchronizePersistentInfo(Varien_Event_Observer $observer) 
{ 
    ... 

    if ($request->getRouteName() == 'api') { 
     return; 
    } 

    ... 
}