শালা, আমি আমাকে কিছু philwinkle ভালবাসেন, কিন্তু আমি কাজের পরামিতি পরিবহনের জটিলতা / ভঙ্গুরতা সঙ্গে মতানৈক্য আছে এবং এলাকা ( adminhtml | নিম্নলিখিতরূপে crontab পরিবর্তন | ফ্রন্টএন্ড | বিশ্বব্যাপী | ইনস্টল ) একটি সারিতে, বিশেষ করে যদি যে কিউ নির্বাহ হতে যাচ্ছে একটি ম্যাজেন্টো প্রসঙ্গ। যদি এমন কোনও মিশ্র প্রসঙ্গ থাকে যার পরিচালনা করা দরকার তবে কিউ সমাধানটি বর্তমান "ইস্যু" এর একটি পুনরায় বাস্তবায়ন!
আমি মনে করি কিউ পদ্ধতির ভঙ্গুর। আমার যুক্তি হ'ল অকাল সময়ত ইভেন্ট অঞ্চল লোড করা আসলেই মোটেই সমস্যা নয়। এটি ব্যাখ্যা করতে, আসুন ব্যাক আপ করুন এবং সমস্যাটি দেখুন:
মৃত্যুর ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফেলার সময় আগে কোনও ইভেন্টের ক্ষেত্রটি লোড করার বিপদ কী?
এটি বুঝতে আমাদের অবশ্যই সম্পাদনের প্রসঙ্গে ইভেন্টের ক্ষেত্রগুলি পরীক্ষা করতে হবে। ম্যাথিয়াস, আমি কল্পনা করেছি যে আপনি এটি ইতিমধ্যে জানেন তবে অন্যের প্রশংসার জন্য:
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;
}
ডেটা সেটআপ স্ক্রিপ্টগুলি কার্যকর করার সময় গ্লোবাল ইভেন্টের অঞ্চলটি লোড হয়ে যায়। রাউটিং-প্রাসঙ্গিক ঘটনা এলাকাসমূহ ( ফ্রন্টএন্ড বা adminhtml ) তার পরে সময় লোড থাকা 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 এর জন্য গ্রেপ করা সহজ হওয়া উচিত। # 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()
আমি এটি পরীক্ষা করে দেখিনি, তবে এটি অ্যাডমিনটিচটিএমএল ইভেন্ট সূচক এবং সংশ্লিষ্ট Mage_Core_Model_App_Area
অবজেক্টটিকে সরিয়ে দেয়।