<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Корчагин Станислав &#187; limb</title>
	<atom:link href="http://korchasa.ru/index.php/tag/limb/feed/" rel="self" type="application/rss+xml" />
	<link>http://korchasa.ru</link>
	<description>Разработка, тестирование, запуск</description>
	<lastBuildDate>Mon, 24 May 2010 23:28:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Limb3 2010.1 RC</title>
		<link>http://korchasa.ru/index.php/2010/05/limb3-2010-1-rc/</link>
		<comments>http://korchasa.ru/index.php/2010/05/limb3-2010-1-rc/#comments</comments>
		<pubDate>Mon, 24 May 2010 18:41:12 +0000</pubDate>
		<dc:creator>korchasa</dc:creator>
				<category><![CDATA[Анонсы]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[limb]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[разработка]]></category>

		<guid isPermaLink="false">http://korchasa.ru/?p=303</guid>
		<description><![CDATA[Ну вот и RC!
С 2007 года мы жили на trunk-версии. Доколе! Хватит!
hg clone https://limb3.googlecode.com/hg/#RC-prepare limb2010.1
Список изменений настолько велик, что проще описать, что мы умеем:
Ядро &#8211; пакет CORE
Подключение классов и поддержка отложенной загрузки кода, работа с пакетами (lmb_package_*), работа с переменными окружения (lmb_env_*), проверка входных параметров (lmb_assert_*), коллекции и единичные контейнеры.
IoC  -пакет TOOLKIT
Пакет TOOLKIT &#8211; есть реализация паттерна Dynamic Service [...]]]></description>
			<content:encoded><![CDATA[<p>Ну вот и RC!</p>
<p>С 2007 года мы жили на trunk-версии. Доколе! Хватит!</p>
<p><code>hg clone https://limb3.googlecode.com/hg/#RC-prepare limb2010.1</code></p>
<p>Список изменений настолько велик, что проще описать, что мы умеем:</p>
<h3><span id="more-303"></span>Ядро &#8211; пакет CORE</h3>
<p>Подключение классов и поддержка отложенной загрузки кода, работа с пакетами (lmb_package_*), работа с переменными окружения (lmb_env_*), проверка входных параметров (lmb_assert_*), коллекции и единичные контейнеры.</p>
<h3>IoC  -пакет TOOLKIT</h3>
<p><a href="http://wiki.limb-project.com/doku.php?id=limb3:ru:packages:toolkit:usage">Пакет TOOLKIT</a> &#8211; есть реализация паттерна <strong>Dynamic Service Locator</strong>. Суть этого паттерна состоит в том, что есть некий легко доступный объект, который является общим местом для доступа ко всем популярным объектам (сервисам) и в том, что возможности этого объекта можно легко расширять. Основное отличие от большинства подобных решений в том, что инстанцирование описывается императивно.</p>
<h3>DBAL (Data Base Abstraction Layer) &#8211; пакет DBAL</h3>
<p>В данный момент поддерживаются: MySQL 4.1+, SQLite, Oracle (OCI8), PostgreSQL 8.2+, Linter</p>
<p>Архитектура <a href="http://wiki.limb-project.com/doku.php?id=limb3:ru:packages:dbal:intro">пакета DBAL</a> вполне стандартная:</p>
<ul>
<li>Driver	Драйвер (Driver) &#8211; базовые классы для работы с базами данных, которые абстрагируют доступ к базе данных. При помощи них осуществляются операции выборки и изменения состояния базы данных (select, update, insert, delete и т.д.).</li>
<li>Query  - группа классов, позволяющих тем или иным образом инкапсулировать SQL запросы.</li>
<li>Criteria  - группа классов, позволяющих строить условия для SQL запросов.</li>
<li>Dump  - группа классов, используемых для загрузки sql-дампов.</li>
</ul>
<h3>ORM (Object-Relation Mapping) &#8211; пакет ACTIVE_RECORD</h3>
<p>Первоначальная идея <a href="http://wiki.limb-project.com/doku.php?id=limb3:ru:packages:active_record:intro">пакета ACTIVE_RECORD</a> взята из фреймворка Ruby-On-Rails. RoR в данном случае выступали в качестве функционального ориентира, но мы не копировали полностью его API и функционал, а реализовывали только то, что было необходимо в текущий момент.</p>
<p>Основные характеристики:</p>
<ul>
<li> автоматическое определение наименований и типов полей таблицы</li>
<li>поддержка отношений один-к-одному, один-ко-многим и много-ко-многим</li>
<li>поддержка ValueObjects</li>
<li>поддержка наследования в рамках одной таблицы (Single Table Inheritance)</li>
<li>поддержка “отложенной загрузки” (LazyLoading) для коллекций</li>
<li>тесная интеграция с шаблонными системами WACT и MACRO</li>
<li>&#8220;жадные&#8221; операции  - attach и join</li>
<li>пользовательские коллекции</li>
</ul>
<h3>Шаблонизация &#8211; пакеты VIEW, WACT и MACRO</h3>
<p>limb3 следует парадигме MVC, как средству логичного разбиения кода, на относительно независимые куски. Пакет VIEW представляет одноименный слой MVC, и представляет из себя абстракцию от конкретного механизма шаблонизации. В данный момент основным шаблонизатором в limb3 является <a href="http://wiki.limb-project.com/doku.php?id=limb3:ru:packages:macro:intro">MACRO</a>, пришедший на смену <a href="http://wiki.limb-project.com/doku.php?id=limb3:ru:packages:wact">WACT&#8217;у</a>. Помимо них VIEW поддерживает Blitz, JSON и нативный PHP.</p>
<p>MACRO &#8211; это своего рода syntactic sugar для нативного РНР. Мы пошли не по пути хэлперов, а остались верны тегам и фильтрам. Кратко о нем:</p>
<ul>
<li>промежуточная компиляция в PHP-код</li>
<li>две области видимости переменных: глобальная и локальная (на уровне шаблона)</li>
<li>механизм фильтров</li>
<li>шаблоны комбинируются через <a href="http://wiki.limb-project.com/doku.php?id=limb3:ru:packages:macro:tags:core_tags:include_tag">include</a> (включение дочернего шаблона), <a href="http://wiki.limb-project.com/doku.php?id=limb3:ru:packages:macro:tags:core_tags:wrap_tag">wrap</a> (включение в родительский шаблон) и <a href="http://wiki.limb-project.com/doku.php?id=limb3:ru:packages:macro:tags:core_tags:template_tag">template+apply</a> (применение шаблона)</li>
<li>поддерживается концепция слотов</li>
<li>готовые теги для работы со списками, деревьями, пейджингом, формами и их полями, ссылками и интернационализацией</li>
<li>готовые фильтры для различного форматирования строк, чисел, дат и специальных форматов</li>
<li>расширяем через собственные теги и фильтры</li>
</ul>
<h3>Веб-приложение &#8211; пакет WEB_APP</h3>
<p><a href="http://wiki.limb-project.com/doku.php?id=limb3:ru:packages:web_app">Пакет WEB_APP</a> позволяет стоить веб-приложения, применяя парадигму MVC (Model-View-Controller). Сам WEB_APP пакет предоставляет классы для реализации только Controller составляющей. Выбор средства для реализации модели и отображения все равно лежит на конечном разработчике приложения, хотя пакет реализован таким образом чтобы максимально упростить работу с приложениями, где в качестве модели будут выбраны “родные” Limb3 пакеты DBAL и ACTIVE_RECORD, а в качестве отображения &#8211; пакет VIEW.</p>
<p>Limb3-приложения строятся обычно на основе цепочки фильтров, которая запускается из файла index.php. Цепочка фильтров стоится из набора типовых фильтров пакета WEB_APP или из тех, которые сочтет нужными реализовать конечный разработчик приложения.</p>
<h3>Тестирование &#8211; пакет TESTS_RUNNER</h3>
<p>TESTS_RUNNER &#8211; пакет для организации и запуска <a style="padding-top: 1px; padding-right: 0px; padding-bottom: 1px; padding-left: 16px; color: purple; text-decoration: underline; background-image: url(http://wiki.limb-project.com/lib/tpl/limb/images/link_icon.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; background-position: 0px 1px; background-repeat: no-repeat no-repeat; margin: 0px;" title="http://www.simpletest.org/" rel="nofollow" href="http://www.simpletest.org/">SimpleTest</a> тестов для приложений, которые содержат большие тестовые наборы. В поставку с пакетом входят классы, которые позволяют выполнять тесты в cli или web-режиме.</p>
<p>Данный пакет не содержит никаких зависимостей от других пакетов, входящих в Limb3, поэтому может использоваться полностью отдельно.</p>
<h3>Прочие пакеты</h3>
<p>Набор практически стандартен: ACL, деревья, кэширование, календарь, CLI-скрипты, админка, работа с конфигами, конвертация дат, интернационализация, обработка изображений, отправка почти и так далее. Полный список пакетов можно найти на <a href="http://wiki.limb-project.com/doku.php?id=limb3:ru:packages">соответствующей странице</a> в документации.</p>
<h3>Инкубатор</h3>
<p>Некоторое время назад мы ввели концепцию инкубатора. В него помещаются все &#8220;молодые&#8221; пакеты, которые еще не прошли испытание боем, недокументированные пакеты или пакеты не покрытые тестами. В данный момент в нем находятся:</p>
<ul>
<li>CONSTRUCTOR &#8211; генератор моделей, контроллеров, шаблонов на основе схемы БД</li>
<li>PROFILE &#8211; средство для профилирования кода, запросов к БД и кешам</li>
<li>CRON &#8211; базовая функциональность для крон-задач, с ведением лога в БД и административной страничкой просмотра этого дела</li>
</ul>
<h2>Текущие проблемы</h2>
<p>Самой большой, на мой взгляд, проблемой является не слишком удобная документация. В данный момент она разбита по пакетам. Опыт показал, что иногда новички испытывают проблему с поискам, ибо не знают где и как оно реализовано.</p>
<p>Помимо этого на версии RC проходят не все тесты, но это поправим до релиза.</p>
<h2>Итого</h2>
<p>Если вы матерый РНР-программист, и всякие ZF и Symfony вам жмут в плечах и не дают расправить крылья, то приходите к нам. Мы очень гибкие, честно-честно.</p>
<ul>
<li>Код: hg clone https://limb3.googlecode.com/hg/#RC-prepare limb2010.1</li>
<li><a href="http://wiki.limb-project.com/doku.php?id=limb3:ru">Документация</a></li>
<li><a href="http://wiki.limb-project.com/doku.php?id=limb3:ru:tutorials:basic">Чтобы въехать</a> (быстрый старт)</li>
<li><a href="http://forum.limb-project.com/">Форум поддержки</a></li>
<li><a href="http://tracker.korchasa.ru">Временный треккер</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://korchasa.ru/index.php/2010/05/limb3-2010-1-rc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как сократить количество правил в ACL (Access Control List)?</title>
		<link>http://korchasa.ru/index.php/2009/02/acl-access-control-list/</link>
		<comments>http://korchasa.ru/index.php/2009/02/acl-access-control-list/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 21:55:44 +0000</pubDate>
		<dc:creator>korchasa</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[limb]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[разработка]]></category>

		<guid isPermaLink="false">http://korchasa.ru/?p=208</guid>
		<description><![CDATA[Главная проблема ACL &#8211; ее размер
Из этой проблемы формируются две гадости: во-первых правила долго писать, во-вторых по ним искать сложно. Попробуем пойти нестандартным путем и решить проблему, сделав роли более селективными.

Стандартные способы борьбы
Для уменьшения количества правил, обычно применяют наследование ролей и ресурсов, а так же множественные роли на один инстанс объекта. В итоге имеем дерево, [...]]]></description>
			<content:encoded><![CDATA[<h3>Главная проблема ACL &#8211; ее размер</h3>
<p>Из этой проблемы формируются две гадости: во-первых правила долго писать, во-вторых по ним искать сложно. Попробуем пойти нестандартным путем и решить проблему, сделав роли более селективными.<br />
<span id="more-208"></span></p>
<h3>Стандартные способы борьбы</h3>
<p>Для уменьшения количества правил, обычно применяют наследование ролей и ресурсов, а так же множественные роли на один инстанс объекта. В итоге имеем дерево, нелинейный алгоритм, и количество проходов по нему отличное от нуля <img src='http://korchasa.ru/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Обратная сторона &#8211; использование масок доступа. Проверка по маске это быстро, но маска не бесконечная. А как же &#8220;показывать только друзьям&#8221;?</p>
<p>В общем надо решать как-то иначе.</p>
<h3>Как же?</h3>
<p>Кто лучше всех знает кем для статьи является конкретный пользователь?</p>
<p>Правильно, сама статья.</p>
<p>На практике оказывается, что информация, которая необходима для определения роли конкретного объекта, в рамках конкретного субъекта, лежит либо в самом субъекте, либо &#8220;близко&#8221; к нему. Так пусть он и определяет, кто в данный момент перед ним.</p>
<p>В <a href="http://wiki.limb-project.com/">LIMB&#8217;е</a> это выглядит так:</p>
<pre lang="php">class Article implements lmbRolesResolverInterface, lmbResourceProviderInterface
{
  function getRoleFor(Member $member)
  {
    if($this->getOwnerId() === $member->getId())
      return 'owner';
    if($this->getCategory()->getModeratorId() === $member->getId())
      return 'moderator';
  }

  function getResource()
  {
    return 'article';
  }
}

class Member implements lmbRoleProviderInterface
{
  function getRole()
  {
    return 'member';
  }
}

//простой пользователь сайта
$this->acl->addRole('member');

//наш контенто-писака, жаждущий кармы
$this->acl->addRole('owner', 'member');

//модер, уныло бдящий за порядком на сайте
$this->acl->addRole('moderator', 'owner');

//а я статья. Просто статья
$this->acl->addResource('article');

//простой пользователь может статью комментировать
$this->acl->allow('member', 'article', 'comment');
//автор ее редактировать
$this->acl->allow('owner', 'article', 'edit');
// модератор акцептировать
$this->acl->allow('moderator', 'article', 'accept');

/* создадим по объектику на каждую роль */
$just_member = new Member();
$just_member->save();
$owner = new Member();
$owner->save();
$moderator = new Member();
$moderator->save();

$category = new ArticleCategory();
$category->setTitle('About LIMB');
$category->setModerator($moderator);
$category->save();

$article = new Article();
$article->setCategory($category);
$article->setOwnerId($owner->getId());
$article->save();

/* проверим нашу "магию" */
var_dump($this->acl->isAllowed($member, $article, 'comment')); //bool(true)
var_dump($this->acl->isAllowed($member, $article, 'edit')); //bool(false)
var_dump($this->acl->isAllowed($member, $article, 'approve')); //bool(false)

var_dump($this->acl->isAllowed($owner, $article, 'comment')); //bool(true)
var_dump($this->acl->isAllowed($owner, $article, 'edit')); //bool(true)
var_dump($this->acl->isAllowed($owner, $article, 'approve')); //bool(false)

var_dump($this->acl->isAllowed($moderator, $article, 'comment')); //bool(true)
var_dump($this->acl->isAllowed($moderator, $article, 'edit')); //bool(false)
var_dump($this->acl->isAllowed($moderator, $article, 'accept')); //bool(true)
</pre>
<p>Данный подход впервые пришлось использовать при создании acl, для фреймворка <a href="http://adept-project.ru/">Adept</a>, а теперь <a href="http://wiki.limb-project.com/doku.php?id=limb3:ru:packages:acl#%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%BE%D0%BB%D0%B8_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0_%D0%B2_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%B0-%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%B0">подобная штука</a> есть и в LIMB&#8217;е.</p>
]]></content:encoded>
			<wfw:commentRss>http://korchasa.ru/index.php/2009/02/acl-access-control-list/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Организация &quot;кусочкового&quot; кеширование HTML</title>
		<link>http://korchasa.ru/index.php/2008/04/%d0%be%d1%80%d0%b3%d0%b0%d0%bd%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%ba%d1%83%d1%81%d0%be%d1%87%d0%ba%d0%be%d0%b2%d0%be%d0%b3%d0%be-%d0%ba%d0%b5%d1%88%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8/</link>
		<comments>http://korchasa.ru/index.php/2008/04/%d0%be%d1%80%d0%b3%d0%b0%d0%bd%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%ba%d1%83%d1%81%d0%be%d1%87%d0%ba%d0%be%d0%b2%d0%be%d0%b3%d0%be-%d0%ba%d0%b5%d1%88%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8/#comments</comments>
		<pubDate>Tue, 08 Apr 2008 18:15:00 +0000</pubDate>
		<dc:creator>korchasa</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[limb]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[кэширование]]></category>
		<category><![CDATA[производительность]]></category>
		<category><![CDATA[разработка]]></category>

		<guid isPermaLink="false">http://korchasa.ru/?p=33</guid>
		<description><![CDATA[Навеяно парой статей на Хабре, и тем, что вчера сделал cache тег для Macro.

Зачем?
Хочется убить двух зайцев: избавиться от запросов за редко изменяемыми данными, и их отрисовки. Вообще это смахивает на попытку минимальным количеством движений сделать глобальное счастье. Можно потом перед другими фрэймворками меряться, ага.
На самом деле задача избавиться от отрисовки куска страницы вообще какая-то [...]]]></description>
			<content:encoded><![CDATA[<p>Навеяно <a href="http://habrahabr.ru/blog/php/38628.html">парой</a> <a href="http://habrahabr.ru/blog/django/39423.html">статей</a> на Хабре, и тем, что вчера сделал cache тег для <a href="http://wiki.limb-project.com/doku.php?id=limb3:ru:packages:macro">Macro</a>.<br />
<span id="more-33"></span></p>
<h3>Зачем?</h3>
<p>Хочется убить двух зайцев: избавиться от запросов за редко изменяемыми данными, и их отрисовки. Вообще это смахивает на попытку минимальным количеством движений сделать глобальное счастье. Можно потом перед другими фрэймворками меряться, ага.</p>
<p>На самом деле задача избавиться от отрисовки куска страницы вообще какая-то странная, если мы используем быстрый шаблонизатор. Application-сервера, при нормальной  арихитектуре, масштабируются легко и непринужденно, а APC, сам закэширует скомпилированный шаблон, если он компилируется в РНР-код, как это сделано в Smarty,  <a href="http://wiki.limb-project.com/doku.php?id=limb3:ru:packages:macro">Macro</a> и многих других.</p>
<p>С другой стороны, если есть простой способ закэшировать, то почему бы и нет.</p>
<h3>Откуда данные, и как заставить протухнуть кэш.</h3>
<p>Данные в шаблоне могут получаться двумя способами. Первый и традиционный это push-подход, когда контроллер заполняет какой-то <a href="http://martinfowler.com/eaaCatalog/dataTransferObject.html">data-transfer-object</a>, или в сам шаблон. Такой подход используется чаще всего, ибо это &#8220;тру MVC&#8221;! <img src='http://korchasa.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Второй подход &#8211; pull. При pull подходе в шаблоне расставляются инструкции по получению данных, в обход контроллера, напрямую от моделей, сервисов и прочих провайдеров данных. Этот способ позволяет избавиться от повторяющихся set&#8217;ов в контроллере, но не позволяет ограничить, из контроллера, их получение, и усложняет поддержку шаблонов, ибо иногда трудно понять откуда получены данные.</p>
<p>Теперь об определении развалидации кэша. Тут тоже два основных подхода. Первый &#8211; ttl(time-to-live &#8211; время жизни). Мы определяем, что список новостей, например, валиден в течении 15 минут. Основной плюс &#8211; мы уверены, что за данными скрипт будет обращаться не чаще чем раз в 15 минут, и зная частоту обращений можем точно расчитать эффективность такого кеша. Второй плюс &#8211; простота реализации. Главный же минус в том, что наш список на самом деле может измениться через секунду после построения кэша, а пользователь увидит изменения только через 15 минут.</p>
<p>Второй вариант сброса кэша &#8211; по действию. Например, тот контроллер(экшн), который отвечает за публикацию новостей, сам убивает кеш, и формирует новый (тут тоже много разных камней, типа lost updates, и прочих порождений многопоточности, но все они решаемы). Плюс &#8211; кэш всегда валиден. Первый минус это сложность реализации (нам нужно добавлять код для работы с кэшем во все места, где идет работа с данными кэша &#8211; публикация новостей, их удаление, и т.д.). Второй минус в том, что эффективность такого кэша сильно зависит от частоты изменения данных.</p>
<p>А теперь тоже самое, но в свете кэширования частей страницы.</p>
<h3>Push me. And then just touch me&#8230;</h3>
<p>Кэшировать части страницы, при push-данных хуже, чем кэшировать эти самые данные. Почему? Потому что мы &#8220;загадим&#8221; кодом работы с кэшем и шаблон, и контроллер, а из плюсов только экономия на отрисовке.</p>
<h3>Pull-данные и развалидация по действию</h3>
<p>Что мы получаем? Логика работы с кешем в шаблоне и тех контроллерах, которые отвечают за действия. Опять не тру, и лучше опять кэшировать данные, через какой-нибудь LastNewsService.</p>
<h3>Pull-данные и ttl</h3>
<p>Вот то ради чего собственно и делаются теги cache, блоки django, компоненты и т.д. Вся логика только в шаблоне (или настройках компонента). Красотища!</p>
<h3>Вывод:</h3>
<p>Кэширование части HTML имеет смысл только для pull данных с устареванием по времени. Во всех остальных случаях его плюсы, по сравнению с кэшированием данных, сводятся к экономии работы шаблонизатора.</p>
]]></content:encoded>
			<wfw:commentRss>http://korchasa.ru/index.php/2008/04/%d0%be%d1%80%d0%b3%d0%b0%d0%bd%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%ba%d1%83%d1%81%d0%be%d1%87%d0%ba%d0%be%d0%b2%d0%be%d0%b3%d0%be-%d0%ba%d0%b5%d1%88%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Тесты PHP шаблонизаторов</title>
		<link>http://korchasa.ru/index.php/2008/02/%d1%82%d0%b5%d1%81%d1%82%d1%8b-php-%d1%88%d0%b0%d0%b1%d0%bb%d0%be%d0%bd%d0%b8%d0%b7%d0%b0%d1%82%d0%be%d1%80%d0%be%d0%b2/</link>
		<comments>http://korchasa.ru/index.php/2008/02/%d1%82%d0%b5%d1%81%d1%82%d1%8b-php-%d1%88%d0%b0%d0%b1%d0%bb%d0%be%d0%bd%d0%b8%d0%b7%d0%b0%d1%82%d0%be%d1%80%d0%be%d0%b2/#comments</comments>
		<pubDate>Fri, 08 Feb 2008 18:44:00 +0000</pubDate>
		<dc:creator>korchasa</dc:creator>
				<category><![CDATA[Тесты]]></category>
		<category><![CDATA[limb]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[производительность]]></category>

		<guid isPermaLink="false">http://korchasa.ru/?p=35</guid>
		<description><![CDATA[Два дня убил на эти тесты и небольшие оптимизации macro. А теперь &#60;звуки горна: та-да&#62;:
Limb template engine benchmark
Примечания:

В роли опкод-кешера используется APC.
Постфикс &#8216;one_tpl&#8217; указывает, что шаблон один, и нет инклудов и враппов.
macro_sl &#8211; версия macro &#8211; с простым локатором шаблонов.
macro_sl_boundled &#8211; версия macro &#8211; с простым локатором и объединенная в один файл.

SVN:
https://svn.limb-project.com/limb/misc/template_engines_bench/
Текущее положение дел таково:



name
rps
%





php_one_tpl
2647
100%


php
2183
82%


blitz-ctx-arr
1994
75%


macro_sl_bundled
1736
66%


blitz
1521
57%


quicky_one_tpl
1457
56%


smarty_one_tpl
1389
52%


macro_sl
1247
47%


smarty
942
36%


quicky
839
32%


macro
768
29%



]]></description>
			<content:encoded><![CDATA[<p>Два дня убил на эти тесты и небольшие оптимизации macro. А теперь &lt;звуки горна: та-да&gt;:</p>
<h4><a href="http://bench.limb-project.com/">Limb template engine benchmark</a></h4>
<h4>Примечания:</h4>
<ul>
<li>В роли опкод-кешера используется <a href="http://ru2.php.net/manual/ru/ref.apc.php">APC</a>.</li>
<li>Постфикс &#8216;one_tpl&#8217; указывает, что шаблон один, и нет инклудов и враппов.</li>
<li>macro_sl &#8211; версия <a href="http://wiki.limb-project.com/doku.php?id=limb3:ru:packages:macro">macro</a> &#8211; с простым локатором шаблонов.</li>
<li>macro_sl_boundled &#8211; версия <a href="http://wiki.limb-project.com/doku.php?id=limb3:ru:packages:macro">macro</a> &#8211; с простым локатором и объединенная в один файл.</li>
</ul>
<h4>SVN:</h4>
<p>https://svn.limb-project.com/limb/misc/template_engines_bench/</p>
<p>Текущее положение дел таково:</p>
<table class="table" style="width: 159px; height: 229px;" border="0">
<thead>
<tr>
<th>name</th>
<th>rps</th>
<th>%</th>
</tr>
</thead>
<thead></thead>
<tbody>
<tr>
<td>php_one_tpl</td>
<td>2647</td>
<td>100%</td>
</tr>
<tr>
<td>php</td>
<td>2183</td>
<td>82%</td>
</tr>
<tr>
<td>blitz-ctx-arr</td>
<td>1994</td>
<td>75%</td>
</tr>
<tr>
<td>macro_sl_bundled</td>
<td>1736</td>
<td>66%</td>
</tr>
<tr>
<td>blitz</td>
<td>1521</td>
<td>57%</td>
</tr>
<tr>
<td>quicky_one_tpl</td>
<td>1457</td>
<td>56%</td>
</tr>
<tr>
<td>smarty_one_tpl</td>
<td>1389</td>
<td>52%</td>
</tr>
<tr>
<td>macro_sl</td>
<td>1247</td>
<td>47%</td>
</tr>
<tr>
<td>smarty</td>
<td>942</td>
<td>36%</td>
</tr>
<tr>
<td>quicky</td>
<td>839</td>
<td>32%</td>
</tr>
<tr>
<td>macro</td>
<td>768</td>
<td>29%</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://korchasa.ru/index.php/2008/02/%d1%82%d0%b5%d1%81%d1%82%d1%8b-php-%d1%88%d0%b0%d0%b1%d0%bb%d0%be%d0%bd%d0%b8%d0%b7%d0%b0%d1%82%d0%be%d1%80%d0%be%d0%b2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
