2012-04-05 3 views
1

я получаю следующее сообщение об ошибке в Magento CE 1.6.1.0Почему Mage_Persistent отключающая/апи/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, которая заставляет меня немного более охотно поднять руки вверх и так.

Я немного поработал над SO и нашел некоторые вопросы, связанные со всей переданной «заголовками» вообще, но не в этом конкретном случае.

Любые мысли?

О, и временное обходное решение, которое у меня на месте, - это просто отключить Mage_Persistent с помощью данных конфигурации persistent/options/enable. Я также немного поработал над тем, можно ли наблюдать событие, чтобы отключить этот модуль только для контроллера WSDL (поскольку это, похоже, единственный, у кого проблемы), но похоже, что это модуль полагается исключительно на этот флаг конфигурации, чтобы определить его статус включен.

UPDATE: Bug было сообщено: http://www.magentocommerce.com/bug-tracking/issue?issue=13370

+0

Magento версия? Mage_Persistant - относительно новая функция, меня это не удивило бы, если бы это проскользнуло сквозь трещины. –

+0

Эй, Алан, да, хороший вопрос - ME 1.11.0 – kalenjordan

ответ

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

0

Этот ответ не предназначен для замены существующего ответа. Но я хотел отбросить код здесь, если кто-то столкнется с этой проблемой, а комментарии не позволяют форматировать код.

Я пошел с простой local код бассейна отключением Mage_Persistent_Model_Observer_Session, чтобы выйти из функции для любых URL маршрутов, которые находятся в пределах /api/*

Не ожидавший этого исправление нужно быть очень долговечны или модернизировать чистые, b/c Я ожидаю, что они исправят это в следующей версии или около того.

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

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

    ... 
} 
Смежные вопросы