Magento学习手记(第六天)
第六天
一、 Magento系统MySQL读写分离配置
Magento使用EAV模型,所以对数据库来说,读操作往往比较大,可以使用读写分离技术有效解决这个问题。
数据库服务器实现主从复制,MySQL提供了内置支持。可以把读压力水平分解(多个从库)。MySQL主从复制可以参考http://www.zuimoban.com/jiaocheng/mysql/2410.html。
Magento程序本身对读写分离提供了内置支持,可以为每个模块都指定读写适配器,如果没有指定就使用默认的读写适配器,而默认的读写适配器又是使用安装时的适配器。
比如模块名叫eav,那么可以在配置文件中指定eav_write和eav_read适配器,如果没有指定就使用系统默认的default_write和default_read,而default_write和default_read通过use节点指定它实际使用default_setup配置的适配器。
1 # app/etc/local.xml 2 <global> 3 <resources> 4 <db> 5 <table_prefix><![CDATA[]]></table_prefix> 6 </db> 7 <default_setup> 8 <connection> 9 <host><![CDATA[192.168.1.10]]></host> 10 <username><![CDATA[magento]]></username> 11 <password><![CDATA[root]]></password> 12 <dbname><![CDATA[magento]]></dbname> 13 <initStatements><![CDATA[SET NAMES utf8]]></initStatements> 14 <model><![CDATA[mysql4]]></model> 15 <type><![CDATA[pdo_mysql]]></type> 16 <pdoType><![CDATA[]]></pdoType> 17 <active>1</active> 18 </connection> 19 </default_setup> 20 </resources> 21 </global>
默认的读写适配器是放置在app/etc/config.xml中的:
1 <default_write> 2 <connection> 3 <use>default_setup</use> 4 </connection> 5 </default_write> 6 <default_read> 7 <connection> 8 <use>default_setup</use> 9 </connection> 10 </default_read>
默认它使用use节点指定使用default_setup适配器,所以我们修改这两个配置就可以实现读写分离:
1 <default_write> 2 <connection> 3 <host><![CDATA[192.168.1.10]]></host> 4 <username><![CDATA[magento]]></username> 5 <password><![CDATA[root]]></password> 6 <dbname><![CDATA[magento]]></dbname> 7 <initStatements><![CDATA[SET NAMES utf8]]></initStatements> 8 <model><![CDATA[mysql4]]></model> 9 <type><![CDATA[pdo_mysql]]></type> 10 <pdoType><![CDATA[]]></pdoType> 11 <active>1</active> 12 </connection> 13 </default_write> 14 <default_read> 15 <connection> 16 <host><![CDATA[192.168.1.20]]></host> 17 <username><![CDATA[magento]]></username> 18 <password><![CDATA[root]]></password> 19 <dbname><![CDATA[magento]]></dbname> 20 <initStatements><![CDATA[SET NAMES utf8]]></initStatements> 21 <model><![CDATA[mysql4]]></model> 22 <type><![CDATA[pdo_mysql]]></type> 23 <pdoType><![CDATA[]]></pdoType> 24 <active>1</active> 25 </connection> 26 </default_read>
读操作全部到达192.168.1.20服务器,写操作全部在192.168.1.10进行。注意,不要在local.xml中修改这个配置。虽然local.xml的配置最优先,但是默认配置有use节点,只要有use节点,就使用use节点的适配器,所以需要在config.xml中直接修改(不要出现use节点)。
每个模块都可以指定自己的读写适配器,如果没有指定就使用默认的配置。这个为读压力的水平分解提供了内置支持。比如某个模块的读操作非常频繁,可以读定向到单独到一个服务器中。通过指定读写适配器,还可以为模块指定使用另一个库等等。
注意,读写分离时,由于采用了MySQL的主从复制,复制的数据库库决不能进行插入更新这种操作(否则可能导致从库无法同步),实际上,程序可能无法百分百保证初始化一个读适配器后不进行更新操作,所以,为了防止这个情况,只给读适配器这个用户Select权限,就能从数据库级别杜绝这个情况发生。
二、 magento后台中的各种Form Widget
1. Text Field
1 $fieldset->addField('title', 'text', array( 2 'label' => Mage::helper('form')->__('Title3'), 3 'class' => 'required-entry', 4 'required' => true, 5 'name' => 'title', 6 'onclick' => "alert('on click');", 7 'onchange' => "alert('on change');", 8 'style' => "border:10px", 9 'value' => 'hello !!', 10 'disabled' => false, 11 'readonly' => true, 12 'after_element_html' => '<small>Comments</small>', 13 'tabindex' => 1 14 ));
2. Time
1 $fieldset->addField('time', 'time', array( 2 'label' => Mage::helper('form')->__('Time'), 3 'class' => 'required-entry', 4 'required' => true, 5 'name' => 'title', 6 'onclick' => "", 7 'onchange' => "", 8 'value' => '12,04,15', 9 'disabled' => false, 10 'readonly' => false, 11 'after_element_html' => '<small>Comments</small>', 12 'tabindex' => 1 13 ));
3. TextArea
1 $fieldset->addField('textarea', 'textarea', array( 2 'label' => Mage::helper('form')->__('TextArea'), 3 'class' => 'required-entry', 4 'required' => true, 5 'name' => 'title', 6 'onclick' => "", 7 'onchange' => "", 8 'value' => '<b><b/>', 9 'disabled' => false, 10 'readonly' => false, 11 'after_element_html' => '<small>Comments</small>', 12 'tabindex' => 1 13 ));
4. Submit Button
1 $fieldset->addField('submit', 'submit', array( 2 'label' => Mage::helper('form')->__('Submit'), 3 'required' => true, 4 'value' => 'Submit', 5 'after_element_html' => '<small>Comments</small>', 6 'tabindex' => 1 7 ));
5. DropDown
1 $fieldset->addField('select', 'select', array( 2 'label' => Mage::helper('form')->__('Select'), 3 'class' => 'required-entry', 4 'required' => true, 5 'name' => 'title', 6 'onclick' => "", 7 'onchange' => "", 8 'value' => '1', 9 'values' => array('-1'=>'Please Select..','1' => 'Option1','2' => 'Option2', '3' => 'Option3'), 10 'disabled' => false, 11 'readonly' => false, 12 'after_element_html' => '<small>Comments</small>', 13 'tabindex' => 1 14 ));
1 $fieldset->addField('select2', 'select', array( 2 'label' => Mage::helper('form')->__('Select Type2'), 3 'class' => 'required-entry', 4 'required' => true, 5 'name' => 'title', 6 'onclick' => "", 7 'onchange' => "", 8 'value' => '4', 9 'values' => array( 10 '-1'=>'Please Select..', 11 '1' => array( 12 'value'=> array(array('value'=>'2' , 'label' => 'Option2') , array('value'=>'3' ,'label' =>'Option3') ), 13 'label' => 'Size' 14 ), 15 '2' => array( 16 'value'=> array(array('value'=>'4' , 'label' => 'Option4') , array('value'=>'5' , 17 'label' =>'Option5') ), 18 'label' => 'Color' 19 ), 20 ), 21 'disabled' => false, 22 'readonly' => false, 23 'after_element_html' => '<small>Comments</small>', 24 'tabindex' => 1 25 ));
6. Radio Button
1 $fieldset->addField('radio', 'radio', array( 2 'label' => Mage::helper('form')->__('Radio'), 3 'name' => 'title', 4 'onclick' => "", 5 'onchange' => "", 6 'value' => '1', 7 'disabled' => false, 8 'readonly' => false, 9 'after_element_html' => '<small>Comments</small>', 10 'tabindex' => 1 11 ));
1 $fieldset->addField('radio2', 'radios', array( 2 'label' => Mage::helper('form')->__('Radios'), 3 'name' => 'title', 4 'onclick' => "", 5 'onchange' => "", 6 'value' => '2', 7 'values' => array( 8 array('value'=>'1','label'=>'Radio1'), 9 array('value'=>'2','label'=>'Radio2'), 10 array('value'=>'3','label'=>'Radio3'), 11 ), 12 'disabled' => false, 13 'readonly' => false, 14 'after_element_html' => '<small>Comments</small>', 15 'tabindex' => 1 16 ));
7. Password Field
1 $fieldset->addField('password', 'password', array( 2 'label' => Mage::helper('form')->__('Password'), 3 'class' => 'required-entry', 4 'required' => true, 5 'name' => 'title', 6 'onclick' => "", 7 'onchange' => "", 8 'style' => "", 9 'value' => 'hello !!', 10 'disabled' => false, 11 'readonly' => false, 12 'after_element_html' => '<small>Comments</small>', 13 'tabindex' => 1 14 ));
1 $fieldset->addField('obscure', 'obscure', array( 2 'label' => Mage::helper('form')->__('Obscure'), 3 'class' => 'required-entry', 4 'required' => true, 5 'name' => 'obscure', 6 'onclick' => "", 7 'onchange' => "", 8 'style' => "", 9 'value' => '123456789', 10 'after_element_html' => '<small>Comments</small>', 11 'tabindex' => 1 12 ));
8. Note
1 $fieldset->addField('note', 'note', array( 2 3 'text' => Mage::helper('form')->__('Text Text'), 4 5 ));
9. Multiselect
1 $fieldset->addField('multiselect2', 'multiselect', array( 2 'label' => Mage::helper('form')->__('Select Type2'), 3 'class' => 'required-entry', 4 'required' => true, 5 'name' => 'title', 6 'onclick' => "return false;", 7 'onchange' => "return false;", 8 'value' => '4', 9 'values' => array( 10 '-1'=> array( 'label' => 'Please Select..', 'value' => '-1'), 11 '1' => array( 12 'value'=> array(array('value'=>'2' , 'label' => 'Option2') , array('value'=>'3' , 13 'label' =>'Option3') ), 14 'label' => 'Size' 15 ), 16 '2' => array( 17 'value'=> array(array('value'=>'4' , 'label' => 'Option4') , array('value'=>'5' , 18 'label' =>'Option5') ), 19 'label' => 'Color' 20 ), 21 ), 22 'disabled' => false, 23 'readonly' => false, 24 'after_element_html' => '<small>Comments</small>', 25 'tabindex' => 1 26 ));
10. Multiline
1 $fieldset->addField('multiline', 'multiline', array( 2 'label' => Mage::helper('form')->__('Multi Line'), 3 'class' => 'required-entry', 4 'required' => true, 5 'name' => 'title', 6 'onclick' => "", 7 'onchange' => "", 8 'style' => "border:10px", 9 'value' => 'hello !!', 10 'disabled' => false, 11 'readonly' => true, 12 'after_element_html' => '<small>Comments</small>', 13 'tabindex' => 1 14 ));
11. Link
1 $fieldset->addField('link', 'link', array( 2 'label' => Mage::helper('form')->__('Link'), 3 'style' => "", 4 'href' => 'www.excellencemagentoblog.com', 5 'value' => 'Magento Blog', 6 'after_element_html' => '' 7 ));
12. Label
1 $fieldset->addField('label', 'label', array( 2 'value' => Mage::helper('form')->__('Label Text'), 3 ));
13. Image Upload
1 $fieldset->addField('image', 'image', array( 2 3 'value' => 'http://www.excellencemagentoblog.com/wp-content/themes/excelltheme/images/logo.png', 4 ));
14. File Upload
1 $fieldset->addField('file', 'file', array( 2 'label' => Mage::helper('form')->__('Upload'), 3 'value' => 'Uplaod', 4 'disabled' => false, 5 'readonly' => true, 6 'after_element_html' => '<small>Comments</small>', 7 'tabindex' => 1 8 ));
15. Date
1 $fieldset->addField('date', 'date', array( 2 'label' => Mage::helper('form')->__('Date'), 3 'after_element_html' => '<small>Comments</small>', 4 'tabindex' => 1, 5 'image' => $this->getSkinUrl('images/grid-cal.gif'), 6 'format' => Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT) 7 ));
16. Checkbox
1 $fieldset->addField('checkbox', 'checkbox', array( 2 'label' => Mage::helper('form')->__('Checkbox'), 3 'name' => 'Checkbox', 4 'checked' => false, 5 'onclick' => "", 6 'onchange' => "", 7 'value' => '1', 8 'disabled' => false, 9 'after_element_html' => '<small>Comments</small>', 10 'tabindex' => 1 11 ));
1 $fieldset->addField('checkboxes', 'checkboxes', array( 2 'label' => Mage::helper('form')->__('Checkboxs'), 3 'name' => 'Checkbox', 4 'values' => array( 5 array('value'=>'1','label'=>'Checkbox1'), 6 array('value'=>'2','label'=>'Checkbox2'), 7 array('value'=>'3','label'=>'Checkbox3'), 8 ), 9 'onclick' => "", 10 'onchange' => "", 11 'value' => '1', 12 'disabled' => false, 13 'after_element_html' => '<small>Comments</small>', 14 'tabindex' => 1 15 ));