RSS Feed
Мар 15

Советы по оптимизации работы с MySQL

Posted on Воскресенье, марта 15, 2009 in php, Новости

На mysql.com появилась отличная статья по оптимизации работы с MySQL, линка: http://forge.mysql.com/wiki/Top10SQLPerformanceTips

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Уникальных посетителей темы: 15

Мар 8

Doctrine Profiler

Posted on Воскресенье, марта 8, 2009 in Doctrine, ZendFramework, Новости

Иногда полезно видеть какие запросы строит 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

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Уникальных посетителей темы: 50

Мар 8

Doctrine Pagination – Постраничная разбивка средствами Doctrine

Posted on Воскресенье, марта 8, 2009 in Doctrine, php, ZendFramework, Новости

В 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>

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Уникальных посетителей темы: 142

Фев 20

Zend Server beta 1

Posted on Пятница, февраля 20, 2009 in php, Новости

zend-server-event-detailsСегодня 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 в двух редакциях:

  1. Zend Server – после beta он будет выпушен как отдельный коммерческий продукт и будет платным
  2. Zend Server CE – бесплатный сервер для разработчиков (он не станет платным)

Для получения информации о продукте, перейдите по ссылке.

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Уникальных посетителей темы: 4

Фев 4

Декодирование строка вида %u04XX

Posted on Среда, февраля 4, 2009 in php

Когда из 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)

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Уникальных посетителей темы: 26

Янв 24

Doctrine ORM for PHP Новая документация

Posted on Суббота, января 24, 2009 in Doctrine, Новости

Вчера была выложена новая, переработанная документация по Doctrine, имя ей «Doctrine ORM for PHP». Вся документация была переписана, исправлена и добавлена и доступна по адресу: http://www.doctrine-project.org/documentation/manual/1_0/en

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Уникальных посетителей темы: 172

Янв 11

MySQL хранимые процедуры

Posted on Воскресенье, января 11, 2009 in Новости

Хранимые процедуры появились начиная с 5 версии MySQL. Они позволяют автоматизировать сложные процессы на уровне MySQL, нежели использовать для этого внешние скрипты. Это даёт нам наиболее высокую скорость выполнения, т.к. мы не гоняем большое количество запросов, а всего лишь один раз вызываем ту или иную процедуру (или функцию).

Читать дальше: http://blog.kovshenin.com/archives/mysql-stored-procedures

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Уникальных посетителей темы: 56

Дек 16

Doctrine – Двойная доза

Posted on Вторник, декабря 16, 2008 in Doctrine, Новости

Вышло сразу два обновления, обновились до версий 1.0.5 и бета 1.1. Смотреть и качать тут.

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Уникальных посетителей темы: 37

Дек 15

Doctrine & ZF Cheat Sheet

Posted on Понедельник, декабря 15, 2008 in Doctrine, ZendFramework

Тут я приведу несколько часто используемых мной приемов для работы с Doctrine и (или) ZF.

1. Выбока по id с проверкой на существование записи:

$courier = Doctrine::getTable("Couriers")->find($this->_getParam('id'));
if ($courier===FALSE) throw new Exception("courierId не найден");
$this->view->courier=$courier->toArray();


Теперь по строкам:

  1. Выбираем из модели Couriers запись с id который нам передал Zend Framework через Router в параметр id.
  2. Если запись не найденна но генерим новое исключение.
  3. Передаем «виеву» массив данных от записи.

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();

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Уникальных посетителей темы: 73

Дек 11

Иерархические структуры данных и Doctrine

Posted on Четверг, декабря 11, 2008 in Doctrine

Михаил Стадник в неплохой статье затронул достаточно интересные моменты работы с Doctrine, а именно:

Хранение иерархических данных (или попросту – деревьев) в реляционных структурах задача довольно нетривиальная и вызывает некоторые проблемы, когда разработчики сталкиваются с подобной задачей…

читаем далее на его блоге: http://mikhailstadnik.com/hierarchical-data-structures-and-doctrine

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Уникальных посетителей темы: 11