Phenom II X3 710 отключен до четириядрен

Успях най-нкарая да отключа четвъртото ядро на моя Phenom II X3 710 процесор. Бройката, с която разполагам не е от най-читавите и не носи много на clock. Все пак успях да го стабилизирам с отключено четвърто ядро на 3.4 GHz.

cpuz

How to calculate the difference between two dates, in full calendar months using Zend_Date

  1. Zend_Date::setOptions(array('format_type' => 'php'));
  2. $start = new Zend_Date('2013-01-31');
  3. $end = new Zend_Date('2013-06-30');
  4.  
  5. $result = $end->toString('Y') * 12 + $end->toString('n')$start->toString('Y') * 12$start->toString('n');
  6. if ($start->addMonth($result)->compare($end) == 1) {
  7.     $result = $result1;
  8. }
  9.  
  10. var_dump($result);

Как работят декораторите в Zend_Form

На практика декораторите в Zend Form са един доста удобен, мощен и полезен инструмент. С тях можем да направим всяка една форма, да изглежда точно така, както е зададена от дизайнерите на сайта. Причината да си блъскаме главата с декораторите е основно една – веднъж постигнали желаната визия на формата, забравяме за HTML-а. Zend_Form ще се грижи вместо нас за създаването на HTML-а, обработването и показването на грешките. Това е особено полезно, когато имаме сайт с например 10 или повече форми с еднаква структура. Тук наблягам на думата структура – формите могат да съдържат различни елементи, но HTML структурата им да е еднаква. Това означава, че се използват едни и същи тагове за показване на грешките или за визуализиране на заглавието на елемента например. Zend_Form прилага различни декоратори за различните елементите. Като цяло, за по-голямата част от елементите се прилгат следните декоратори:

ViewHelper
Errors
HtmlTag (<dd>)
Label (with wrapping <dt> tag)

Ето и как изглежда HTMl-а за един от елементите, генериран посредством декораторите по подразбиране:

  1. <dt id="name-label"><label for="name" class="required">Your name</label></dt>
  2. <dd id="name-element">
  3. <input type="text" name="name" id="name" value="" />
  4. <ul class="errors"><li>Value is required and can't be empty</li></ul></dd>

Това, което се случва е много просто е повече от елементарно. Трябва да се отбележи, че генерирането на HTML-а става от вътре на вън. С други думи първо се създавата input елементът. Грижата за това има ViewHelper декораторът. Резултат след изпълнението на ViewHelper декоратора, може да се види по-долу.

  1. <input type="text" name="name" id="name" value="" />

След това се добавят грешките, ако има такива разбира се. За това се грижи Errors декораторът. Ето и как ще изглежда генерираният HTML след прилагането на Errors декоратора.

  1. <input type="text" name="name" id="name" value="" />
  2. <ul class="errors"><li>Value is required and can't be empty</li></ul>

Всичко това се обвива в dd таг посредсвтом HtmlTag декоратора:

  1. <dd id="name-element">
  2. <input type="text" name="name" id="name" value="" />
  3. <ul class="errors"><li>Value is required and can't be empty</li></ul></dd>

Накрая се добавя label-а, обвит в dt таг. Грижа за това има Label декораторът. Това е резултатът (отново), който се получава след прилагането на всички декоратори.

  1. <dt id="name-label"><label for="name" class="required">Your name</label></dt>
  2. <dd id="name-element">
  3. <input type="text" name="name" id="name" value="" />
  4. <ul class="errors"><li>Value is required and can't be empty</li></ul></dd>

Освен декоратори за елементите, има и декоратори, които се прилагат към формата, след генерирането на всички елементи. Ето ги и тях (по подразбиране).

FormElements
HtmlTag (<dl>)
Form

Първият – FormElements, се грижи за рендирането на елементите. Резултатът се обвива в <dl> таг посредством втория декоратор – HtmlTag. Накрая се прилага Form декораторът, който обвива всичко във <form> таг. Ето как би изглеждала една форма с три полета (name, email, phone) и един submit бутон, генерирана посредством Zend_Form, с декораторите по подразбиране.

  1. <form enctype="application/x-www-form-urlencoded" action="" method="post"><dl class="zend_form">
  2. <dt id="name-label"><label for="name" class="required">Your name</label></dt>
  3. <dd id="name-element">
  4. <input type="text" name="name" id="name" value="" />
  5. <ul class="errors"><li>Value is required and can't be empty</li></ul></dd>
  6. <dt id="email-label"><label for="email" class="required">Your email</label></dt>
  7. <dd id="email-element">
  8. <input type="text" name="email" id="email" value="test@test.com" /></dd>
  9. <dt id="phone-label"><label for="phone" class="required">Your phone number</label></dt>
  10. <dd id="phone-element">
  11. <input type="text" name="phone" id="phone" value="1111" /></dd>
  12. <dt id="submit-label">&#160;</dt><dd id="submit-element">
  13. <input type="submit" name="submit" id="submit" value="Save changes" /></dd></dl></form>

Zend View – output на XML файл

Какво е XML едва ли е нужно да се обяснява. На всеки що годе запознат с компютри му се е налагало да го използва, на мен също. Най-често се случва да описвам някакви конфигурационни променливи необходими за стартирането на някакъв third party софтуер. Пресен пример е едно slideshow писано на flash, което се настройваше посредством XML файл. Налагаше се да опиша пълния път до всички картинки, използвани в slideshow-то. Тук изникна следният проблем – свързан с това, че сайтът върху който работех първо се стартираше на демо адрес от рода на demo.domain.com и ако всичко беше наред с него се прехвърляше на domain.com. Проблемът се изразява в това, че пътят до картинките трябва да се промени (съответно и xml файлът) при прехвърлянето от demo.domain.com към domain.com. Изключително досадна и ненужна задача, предвид това, че вече сме дефинирали като константа URL-а върху който работи сайтът. За де избегна преправянето на този XML файл направих направих нов action, който да се грижи единствено и само за XML-а, съответно го прекарах и през Zend View, за да мога да сложа константата с URL-а.

  1. class IndexController extends Zend_Controller_Action
  2. {
  3.  
  4.     public function slideshowAction()
  5.     {
  6.         $this->_helper->layout()->disableLayout();
  7.         $this->_helper->viewRenderer->setNoRender(true);
  8.  
  9.         $view = new Zend_View();
  10.         $view->setScriptPath(APPLICATION_PATH . '/views/scripts/index/');
  11.         $content = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>";
  12.         $content .= $view->render('slideshow.phtml');
  13.  
  14.         header('Content-Type: text/xml');
  15.         echo $content;
  16.     }
  17. }

Прекалено бавен Zend_Db_Table!

Днес изгубих известно време в чудене, защо заявките към базата, които минават през Zend_Db_Table са толкова бавни. Оказа се, че за да работи Zend_Db_Table му е необходима структурата на базата. За целта се изпълняват много на брой DESCRIBE заявки. Всичко това е добре описано в документацията, но аз стигнах до него по трудния начин. Проблемът се решава с кеширане. Само за сравнение, броят на заявките които се изпълняваха на една от страниците върху които работя преди кеширането бяха около 1800, а след това паднаха до 800. Както сами виждате има смисъл да се кешира и дори е задължително, когато заявките са много на брой.
Две думи ще кажа и за Zend_Db_Profiler, защото именно него използвах, за да хвана проблема. Доста полезна библиотека, особено когато трябва да се направи някакъв анализ на изпълняваните заявки. Удачно решение е след приключването на всички заявки (зареждането на страницата, така да се каже) да се използва Zend_Db_Profiler и посредством него да разберем колко и какви заявки са изпълнявани. Аз си направих един controller plugin за целта.

  1. class myLibs_Controller_Plugin_DbProfiler extends Zend_Controller_Plugin_Abstract {
  2.  
  3.     public function dispatchLoopShutdown()
  4.     {
  5.         $registry = Zend_Registry::getInstance();
  6.         $dbh = $registry->get('dbAdapter');
  7.  
  8.         $profiler = $dbh->getProfiler();
  9.         var_dump($profiler->getTotalElapsedSecs());
  10.         var_dump($profiler->getTotalNumQueries());
  11.  
  12.         $longestTime  = 0;
  13.         $longestQuery = null;
  14.         foreach ($profiler->getQueryProfiles() as $query) {
  15.             if ($query->getElapsedSecs() > $longestTime) {
  16.                 $longestTime  = $query->getElapsedSecs();
  17.                 $longestQuery = $query->getQuery();
  18.             }
  19.         }
  20.  
  21.         var_dump($longestTime);
  22.         var_dump($longestQuery);
  23.     }
  24. }

След това модифицирах леко Bootstrap-a, така че да стартирам db profiler-а и да регистрирам plugin-а.

  1. protected function _initDbAdapter()
  2. {
  3.     // … some code ..
  4.     $dbAdapter->getProfiler()->setEnabled(true);
  5.     // … some code ..
  6. }
  7.  
  8. protected function _initPlugins()
  9. {
  10.     $front->registerPlugin(new myLibs_Controller_Plugin_DbProfiler());
  11. }