दमयन्ती, मुझे कुछ दार्शनिकों से प्यार है, लेकिन मुझे कार्य मापदंडों और क्षेत्र ( adminhtml | crontab | frontend | global | install ) को एक कतार में ले जाने की जटिलता / भंगुरता से असहमत होना होगा , खासकर अगर वह कतार क्रियान्वित होने जा रही है। एक Magento के संदर्भ। यदि मिश्रित संदर्भ हैं जिन्हें संभालने की आवश्यकता है तो कतार समाधान वर्तमान "मुद्दे" का पुन: कार्यान्वयन है!
मुझे लगता है कि कतार का दृष्टिकोण भंगुर है। मेरा तर्क है कि समय से पहले घटना वाले क्षेत्रों को लोड करना वास्तव में एक मुद्दा नहीं है। इसे समझाने के लिए, आइए हम आगे बढ़ते हैं और समस्या को देखते हैं:
निष्पादन क्षेत्र में समय से पहले एक घटना क्षेत्र को लोड करने का खतरा क्या है?
इसे समझने के लिए हमें निष्पादन के संदर्भ में घटना क्षेत्रों की जांच करनी चाहिए। माथियास, मुझे लगता है कि आप पहले से ही यह जानते हैं, लेकिन दूसरों के संपादन के लिए:
Mage_Core_Model_App::run()
मोर्चा नियंत्रक के अनुरोध को भेजने से पहले डेटा सेटअप स्क्रिप्ट निष्पादित की जाती है :
public function run($params)
{
$options = isset($params['options']) ? $params['options'] : array();
$this->baseInit($options);
Mage::register('application_params', $params);
if ($this->_cache->processRequest()) {
$this->getResponse()->sendResponse();
} else {
$this->_initModules();
//Global event area is loaded here
$this->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);
if ($this->_config->isLocalConfigLoaded()) {
$scopeCode = isset($params['scope_code']) ? $params['scope_code'] : '';
$scopeType = isset($params['scope_type']) ? $params['scope_type'] : 'store';
$this->_initCurrentStore($scopeCode, $scopeType);
$this->_initRequest();
//Data setup scripts are executed here:
Mage_Core_Model_Resource_Setup::applyAllDataUpdates();
}
$this->getFrontController()->dispatch();
}
return $this;
}
जब तक डेटा सेटअप स्क्रिप्ट निष्पादित हो रही हैं तब तक ग्लोबल इवेंट एरिया लोड हो चुका है। राउटरिंग - रेफ़रेंशियल ईवेंट एरिया ( फ्रंटएंड या एडमिनिस्ट्रेश ) को Mage_Core_Controller_Varien_Action::preDispatch()
राउटर के परिणामस्वरूप कंट्रोलर एक्शन से मेल खाते हुए लोड किया जाता है ( area
नाम इनहेरिटेंस के माध्यम से सेट किया जाता है):
public function preDispatch()
{
//...
Mage::app()->loadArea($this->getLayout()->getArea());
//...
}
इसलिए आमतौर पर ऐप इनिशियलाइज़ेशन के दौरान केवल ग्लोबल इवेंट क्षेत्र के तहत कॉन्फ़िगर किए गए पर्यवेक्षकों को निष्पादित किया जाएगा। अगर सेटअप स्क्रिप्ट कुछ ऐसा करता है
$this->loadAreaPart(Mage_Core_Model_App_Area::AREA_ADMINHTML, Mage_Core_Model_App_Area::PART_EVENTS);
इसके बाद केवल दो खतरे हैं:
- एक पर्यवेक्षक के तहत गलत कॉन्फ़िगर किया गया है adminhtml एक संदर्भ के कम घटना का निरीक्षण करने जैसे
controller_front_init_before
याcontroller_front_init_routers
- अनुरोध एक फ्रंटएंड अनुरोध है।
# 1 के लिए grep करना आसान होना चाहिए। # 2 वास्तविक चिंता है, और मुझे लगता है कि प्रतिबिंब समस्या को हल कर सकता है (ध्यान दें कि मैं बहुत ही अनुभवहीन हूं जो प्रतिबिंब के साथ अनुभव कर रहा है:
<?php
//Start setup script as normal
$installer = $this;
$installer->startSetup()
//Load adminhtml event area
Mage::app()->loadAreaPart(
Mage_Core_Model_App_Area::AREA_ADMINHTML,
Mage_Core_Model_App_Area::PART_EVENTS
);
// your setup script logic here
//I hope this isn't a bad idea.
$reflectedApp = new ReflectionClass('Mage_Core_Model_App');
$_areas = $reflectedApp->getProperty('_areas');
$_areas->setAccessible(true);
$areas = $_areas->getValue(Mage::app());
unset($areas['adminhtml']);
$_areas->setValue(Mage::app(),$areas); //reset areas
//End setup script as normal
$installer->endSetup()
मैंने इसका परीक्षण नहीं किया है, लेकिन यह adminhtml इवेंट इंडेक्स और संबंधित Mage_Core_Model_App_Area
ऑब्जेक्ट को हटा देता है ।