为什么Mage_会持续破坏/api/wsdl?soap

为什么Mage_会持续破坏/api/wsdl?soap,api,session,magento,Api,Session,Magento,我在Magento CE 1.6.1.0中遇到以下错误 警告:session_start()[]:无法发送会话cookie-已由/home/dev/env/var/www/user/dev/wdcastaging/lib/Zend/Controller/Response/Abstract.php:586中/home/dev/env/var/www/user/dev/wdcastaging/app/code/core/Mage/core/Model/session/Abstract/Varien.

我在Magento CE 1.6.1.0中遇到以下错误

警告:session_start()[]:无法发送会话cookie-已由/home/dev/env/var/www/user/dev/wdcastaging/lib/Zend/Controller/Response/Abstract.php:586中/home/dev/env/var/www/user/dev/wdcastaging/app/code/core/Mage/core/Model/session/Abstract/Varien.php第119行的/code>

访问
/api/soap/?wsdl

显然,在输出WSDL文件的全部内容之后,正在尝试执行
会话\u start()
,从而导致错误

为什么magento在输出所有基准之后尝试启动会话?我很高兴你问。所以它看起来像是在Mage\u Persistent钩住
控制器\u front\u send\u response\u之后,为了调用
synchronizePersistentInfo()
,而调用
synchronizePersistentInfo()
,从而触发
会话启动()

有趣的是,这种情况并不总是发生,最初加载的WSDL对我来说很好,最初我绞尽脑汁,试图看看我们的安装中有哪些定制导致了这种情况,但我所做的跟踪似乎表明这一切完全发生在核心内部

我们也经历了一点点(完全不相关的)与法师执著的陌生感,这让我更愿意在这一点上举手,所以它

我在SO上做了一些搜索,发现了一些与整个“邮件头已经发送”相关的问题,但不是这个具体案例

有什么想法吗

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


更新:已报告错误:

我将向Magento团队报告这是一个错误。Magento API控制器都通过标准Magento action controller对象进行路由,并且所有这些对象都继承自
Mage\u API\u controller\u 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支持部门得到的快速答案)是禁用默认配置设置的persistant cart功能,然后为需要它的特定商店启用它。这将使手推车


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

此答案并非要取代现有答案。但我想在这里放一些代码,以防有人遇到这个问题,并且注释实际上不允许代码格式化

我对
Mage\u Persistent\u Model\u Observer\u Session
进行了一个简单的
local
code池覆盖,退出了
/api/*
中任何URL路由的函数

我不希望这个补丁需要非常长寿命或者升级友好,b/c我希望他们在下一个版本中修复这个补丁

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

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

    ...
}

Magento版本?Mage_Persistant是一个相对较新的功能,如果它从裂缝中溜走,我不会感到惊讶。嘿,艾伦,是的,问得好-我1.11.0Oops,对不起,我在我1.11.0中做了很多工作,但出现问题的实例实际上是CE1.6.1.0-我可以想象同样的根本原因正在发挥作用。