Советы по оптимизации работы с MySQL
На mysql.com появилась отличная статья по оптимизации работы с MySQL, линка: http://forge.mysql.com/wiki/Top10SQLPerformanceTips
Уникальных посетителей темы: 15Doctrine Profiler
Иногда полезно видеть какие запросы строит Doctrine и сколько времени они выполняются. Описание профайлера в оригинале тут: http://www.doctrine-project.org/documentation/manual/1_1/en/component-overview#profiler
Ниже мой пример.
1. В Initializer.php
public function initDb() { ... $profiler = new Doctrine_Connection_Profiler (); Doctrine_Manager::getInstance()->setListener($profiler); Zend_Registry::set('dbProfiler', $profiler); ...
2. В bootstrap.php
... //В конце файла $profiler=Zend_Registry::get('dbProfiler'); echo "<div class=box style=\"font-family: Courier New; font-size: 11px\">"; $time = 0; foreach ( $profiler as $event ) { $time += $event -> getElapsedSecs (); echo "<b><font color=red>".$event ->getName () . "</font></b> [" . sprintf ("%f", $event -> getElapsedSecs ()) . "]<br>\n"; echo $event ->getQuery () . "<br>\n"; $params = $event ->getParams (); if( ! empty ( $params )) { var_dump ( $params ); echo "<br>"; } } echo "<br><b>Total time : " . $time . "</b><br>\n"; echo "</div>"; ...
В итоге при каждом генерировании страницы, внизу, мы увидем профайл doctrine, к примеру вот так:
query [0.001810] SELECT l.id AS l__id, l.date AS l__date, l.username AS l__username, l.ip AS l__ip, l.text AS l__text, l.created_at AS l__created_at, l.updated_at AS l__updated_at FROM logs l ORDER BY l.date DESC LIMIT 20 prepare [0.000102] SELECT u.id AS u__id, u.status AS u__status, u.role AS u__role, u.username AS u__username, u.password AS u__password, u.email AS u__email, u.im AS u__im, u.lastlogin AS u__lastlogin, u.ballance AS u__ballance, u.created_at AS u__created_at, u.updated_at AS u__updated_at FROM users u WHERE u.id = ? LIMIT 1 execute [0.002061] SELECT u.id AS u__id, u.status AS u__status, u.role AS u__role, u.username AS u__username, u.password AS u__password, u.email AS u__email, u.im AS u__im, u.lastlogin AS u__lastlogin, u.ballance AS u__ballance, u.created_at AS u__created_at, u.updated_at AS u__updated_at FROM users u WHERE u.id = ? LIMIT 1 array(1) { [0]=> string(1) "1" } fetch [0.000094] SELECT u.id AS u__id, u.status AS u__status, u.role AS u__role, u.username AS u__username, u.password AS u__password, u.email AS u__email, u.im AS u__im, u.lastlogin AS u__lastlogin, u.ballance AS u__ballance, u.created_at AS u__created_at, u.updated_at AS u__updated_at FROM users u WHERE u.id = ? LIMIT 1 fetch [0.000075] SELECT u.id AS u__id, u.status AS u__status, u.role AS u__role, u.username AS u__username, u.password AS u__password, u.email AS u__email, u.im AS u__im, u.lastlogin AS u__lastlogin, u.ballance AS u__ballance, u.created_at AS u__created_at, u.updated_at AS u__updated_at FROM users u WHERE u.id = ? LIMIT 1 Total time : 0.00414180755615
Уникальных посетителей темы: 50Doctrine Pagination – Постраничная разбивка средствами Doctrine
В ZendFramework конечно есть модуль Pagination, но после его использования я решил поглядеть а что есть у Doctrine и нужно сказать что у нее это ЕСТЬ и реализованно неплохо!
Оригинальное описание находится тут: http://www.doctrine-project.org/documentation/manual/1_0/en/utilities#pagination
Пример использования:
1. В контроллере пишем:
$currentPage=$this->_getParam("pager"); // Номер страницы из роутера $resultsPerPage=20; // Cколько результатор на одной странице $pager_layout = new Doctrine_Pager_Layout ( new Doctrine_Pager ( Doctrine_Query :: create () ->from ( "Users u" ) ->orderBy ( "id DESC" ), $currentPage , $resultsPerPage ), new Doctrine_Pager_Range_Sliding ( array ( "chunk" => 5 )), "/admin/users/index/{%page_number}" ); $pager_layout ->setTemplate ('<a href="{%url}" class="pager">{%page}</a> '); $pager_layout ->setSelectedTemplate ('<b class="pager">{%page}</b> '); $pager = $pager_layout ->getPager (); $users = $pager->execute(); $this->view->pager = "Page: ".$pager_layout ->display('',true)." Total items: <b>".$pager->getNumResults()."</b>";
2. В роутере пропишем:
$router->addRoute('amdinUsers', new Zend_Controller_Router_Route('admin/users/index/:pager', array('module' => 'admin', 'controller' => 'users', 'action' => 'index', 'pager' => '1') ));
3. В виеве соответственно ловим:
<div class="pager_box"><?php echo $this->pager ?></div>
Уникальных посетителей темы: 142Zend Server beta 1
Сегодня Zend выпустил новый продукт, Zend Server beta1 ! Если кратко, то это «подобие» xampp, denwer и т.д. но от самой Zend.
В данный продукт включены следующие компненты:
- Apache 2.2.8
- PHP 5.2.8
- Zend Framework 1.7.4
- PHP optimizer и кучу других продуктов Zend
- Админский интерфейс для быстрой настройки и работы.
Продукт доступен для windows, linux и macOS в двух редакциях:
- Zend Server – после beta он будет выпушен как отдельный коммерческий продукт и будет платным
- Zend Server CE – бесплатный сервер для разработчиков (он не станет платным)
Для получения информации о продукте, перейдите по ссылке.
Уникальных посетителей темы: 4Декодирование строка вида %u04XX
Когда из javascript приходит строка в виде:
%u041A%u043E%u043C%u043F%u0430%u043D%u0438%u044F %u0418%u043D%u0441%u0430%u0439%u0442 (%u0418%u0440%u043A%u0443%u0442%u0441%u043A) | %u0424%u0438%u043D%u0430%u043D%u0441%u043E%u0432%u0430%u044F %u043A%u043E%u043C%u043F%u0430%u043D%u0438%u044F "%u0421%u0438%u0432%u0435%u0440
То декодировать ее можно с помощью следующей функции:
function global_decode($str) { return html_entity_decode(preg_replace_callback( '|(?:%u.{4})|', create_function( '$matches', 'return \'&#\'.hexdec(substr($matches[0], 2)).\';\';' ), $str ),ENT_QUOTES, "utf-8"); }
В итоге получим UTF8 строку (либо заменим на CP1251 и получим в windows-1251)
Уникальных посетителей темы: 26Doctrine ORM for PHP Новая документация
Вчера была выложена новая, переработанная документация по Doctrine, имя ей «Doctrine ORM for PHP». Вся документация была переписана, исправлена и добавлена и доступна по адресу: http://www.doctrine-project.org/documentation/manual/1_0/en
Уникальных посетителей темы: 172MySQL хранимые процедуры
Хранимые процедуры появились начиная с 5 версии MySQL. Они позволяют автоматизировать сложные процессы на уровне MySQL, нежели использовать для этого внешние скрипты. Это даёт нам наиболее высокую скорость выполнения, т.к. мы не гоняем большое количество запросов, а всего лишь один раз вызываем ту или иную процедуру (или функцию).
Читать дальше: http://blog.kovshenin.com/archives/mysql-stored-procedures
Уникальных посетителей темы: 56Doctrine – Двойная доза
Вышло сразу два обновления, обновились до версий 1.0.5 и бета 1.1. Смотреть и качать тут.
Уникальных посетителей темы: 37Doctrine & ZF Cheat Sheet
Тут я приведу несколько часто используемых мной приемов для работы с Doctrine и (или) ZF.
1. Выбока по id с проверкой на существование записи:
$courier = Doctrine::getTable("Couriers")->find($this->_getParam('id')); if ($courier===FALSE) throw new Exception("courierId не найден"); $this->view->courier=$courier->toArray();
Теперь по строкам:
- Выбираем из модели Couriers запись с id который нам передал Zend Framework через Router в параметр id.
- Если запись не найденна но генерим новое исключение.
- Передаем «виеву» массив данных от записи.
2. Сбор все related записей у модели
Как неидеальный пример:
$query = new Doctrine_Query(); $query->from('CityAddress ca,ca.CityStreets cs,cs.CityRegions cr') >where("id=?",intval($id) ); $result = $query->execute( array(),Doctrine::HYDRATE_ARRAY );
Что вернет нам не только запись но и все «привязанные» записи (hasOne, hasMany)
3. NOW()
Вернуть текущее время и дату
$messages->date_delivery=new Doctrine_Expression('NOW()');
4. Last Insert ID
Вернуть последний добавленный ID записи
$lastInsertedId=$model->getIncremented();
Уникальных посетителей темы: 73Иерархические структуры данных и Doctrine
Михаил Стадник в неплохой статье затронул достаточно интересные моменты работы с Doctrine, а именно:
Хранение иерархических данных (или попросту – деревьев) в реляционных структурах задача довольно нетривиальная и вызывает некоторые проблемы, когда разработчики сталкиваются с подобной задачей…
читаем далее на его блоге: http://mikhailstadnik.com/hierarchical-data-structures-and-doctrine
Уникальных посетителей темы: 11