<?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; PHP</title>
	<atom:link href="http://tigor.com.ua/blog/category/development/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://tigor.com.ua/blog</link>
	<description>О разработке веб-приложений на Symfony</description>
	<lastBuildDate>Fri, 18 Jun 2010 08:27:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Инструменты обеспечение качества программного продукта для PHP</title>
		<link>http://tigor.com.ua/blog/2010/04/23/quality-assurance-in-php-projects-2/</link>
		<comments>http://tigor.com.ua/blog/2010/04/23/quality-assurance-in-php-projects-2/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 07:38:57 +0000</pubDate>
		<dc:creator>ingvar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[QA]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=1617</guid>
		<description><![CDATA[В тексте статьи находится  краткий обзор инструментов с помощью которых можно анализировать  различные характиристики в приложениях созданных на PHP. Данный материал появился на свет в  результате некоторых экспериментов в области непрерывной интеграции, и  должен был являться частью статьи про непрерывную интеграцию (спойлерить  пока не буду, боюсь сглазить) все в том [...]]]></description>
			<content:encoded><![CDATA[<p>В тексте статьи находится  краткий обзор инструментов с помощью которых можно анализировать  различные характиристики в приложениях созданных на <a href="http://lurkmore.ru/PHP">PHP</a>. Данный материал появился на свет в  результате некоторых экспериментов в области непрерывной интеграции, и  должен был являться частью статьи про непрерывную интеграцию (спойлерить  пока не буду, боюсь сглазить) все в том же РНР, но я решил все-таки  выделить его в самостоятельный обзор, так как возможно, в последующих  статьях я буду ссылаться на него, а так же надеюсь узнать об аналогичных  инструментах еще не попавших мне на глаза. Некоторые инструменты уже  были рассмотрены достаточно подробно, но тем не менее полного списка  всех доступных еще не было.</p>
<p><span id="more-1617"></span></p>
<h6><strong>PHP_CodeCoverage</strong></h6>
<p>PHP_CodeCoverage это библиотека, которая обеспечивает сбор, обработку и  отображение информации о покрытии кода тестами, требует xdebug, а так  же использует некоторые сторонние библиотеки. Более подробная информация  находится на официальном сайте.</p>
<ul>
<li>Автор: <a href="http://sebastian-bergmann.de/">Sebastian Bergmann</a></li>
<li>Официальный сайт: <a href="http://github.com/sebastianbergmann/php-code-coverage">http://github.com/sebastianbergmann/php-code-coverage</a></li>
<li>Официальный PEAR канал: <a href="http://pear.phpunit.de/">http://pear.phpunit.de/</a></li>
<li>Текущая версия: 0.9.0 (alpha)</li>
</ul>
<h6><strong>PhpDocumentor</strong></h6>
<p>На основании комментариев в исходном коде генерирует соответствующую  документацию, имеет уйму возможностей в числе которых презентабельный и  дружественный к пользователю шаблоны.</p>
<ul>
<li>Автор: <a href="http://blog.joshuaeichorn.com/">Joshua Eichorn</a></li>
<li>Официальный сайт: <a href="http://www.phpdoc.org/">http://www.phpdoc.org/</a></li>
<li>Официальный PEAR канал: <a href="http://pear.php.net/">http://pear.php.net/</a></li>
</ul>
<h6><strong>PHP Copy/Paste Detector</strong> [phpcpd]</h6>
<p>Название говорит само за себя: находит дублированный код и сообщает о  нем.</p>
<ul>
<li>Автор: <a href="http://sebastian-bergmann.de/">Sebastian Bergmann</a></li>
<li>Официальный сайт: <a href="http://github.com/sebastianbergmann/phpcpd">http://github.com/sebastianbergmann/phpcpd</a></li>
<li>Официальный PEAR канал: <a href="http://pear.php.net/">http://pear.php.net/</a></li>
<li>Текущая версия: 1.3.1 (stable)</li>
</ul>
<h6><strong>PHP_Depend</strong></h6>
<p>Собирает и отображает статистическую информацию о проекте.</p>
<ul>
<li>Автор: <a href="http://manuel-pichler.de/">Manuel Pichler</a></li>
<li>Официальный сайт: <a href="http://pdepend.org/">http://pdepend.org/</a></li>
<li>Официальный PEAR канал: <a href="http://pear.pdepend.org/">http://pear.pdepend.org/</a></li>
<li>Текущая версия: 0.9.11 (beta)</li>
</ul>
<h6><strong>PHP_PMD</strong></h6>
<p>Ответвление от PHP_Depend: отображает информацию о размерах кода,  используемых именах, неиспользуемом коде. <a href="http://habrahabr.ru/blogs/php/90400/">Обзор</a> от <a href="http://devman.habrahabr.ru/">DevMan</a></p>
<ul>
<li>Автор: <a href="http://manuel-pichler.de/">Manuel Pichler</a></li>
<li>Официальный сайт: <a href="http://phpmd.org/">http://phpmd.org/</a></li>
<li>Официальный PEAR канал: <a href="http://pear.phpmd.org/">http://pear.phpmd.org/</a></li>
<li>Текущая версия: 0.2.5 (alpha)</li>
</ul>
<h6><strong>PHP_CodeSniffer</strong></h6>
<p>Позволяет наблюдать за состоянием PHP, Javascript и CSS файлов и  определять отклонения от принятых стандартов кодирования. <a href="http://habrahabr.ru/blogs/php/89192/">Обзор</a> от <a href="http://devman.habrahabr.ru/">DevMan</a></p>
<ul>
<li>Автор: <a href="http://gregsherwood.blogspot.com/">Greg Sherwood</a></li>
<li>Официальный сайт: <a href="http://matrix.squiz.net/developer/tools/php_cs">http://matrix.squiz.net/developer/tools/php_cs</a></li>
<li>Официальный PEAR канал: <a href="http://pear.php.net/">http://pear.php.net/</a></li>
<li>Текущая версия: 1.2.2 (stable)</li>
</ul>
<h6><strong>PHPUnit</strong></h6>
<p>Пожалуй самый известный инструмент для модульного тестирования, думаю в  представлении не нуждается.</p>
<ul>
<li>Автор: <a href="http://sebastian-bergmann.de/">Sebastian Bergmann</a></li>
<li>Официальный сайт: <a href="http://www.phpunit.de/">http://www.phpunit.de/</a></li>
<li>Официальный PEAR канал: <a href="http://pear.phpunit.de/">http://pear.phpunit.de/</a></li>
<li>Текущая версия: 3.4.12 (stable)</li>
</ul>
<h6><strong>PHP_CodeBrowser</strong></h6>
<p>Обеспечивает просмотр кода с синтаксической подсветкой, имеет богатые  возможности по визуализации, может использовать отчеты от: phpunit,  phpcpd, padawan, phpcs. Из <a href="http://blog.thinkphp.de/archives/464-PHP_CodeBrowser-Release-version-0.1.0.html">этого  обзора</a> можно понять насколько инструмент перспективный.</p>
<ul>
<li>Автор: <a href="http://www.mayflower.de/">Mayflower GmbH</a></li>
<li>Официальный сайт: <a href="http://github.com/mayflowergmbh/PHP_CodeBrowser">http://github.com/mayflowergmbh/PHP_CodeBrowser</a></li>
<li>Официальный PEAR канал: <a href="http://pear.phpunit.de/">http://pear.phpunit.de/</a></li>
<li>Текущая версия: 0.1.3 (alpha)</li>
</ul>
<h6><strong>phploc</strong></h6>
<p>Еще один инструмент собирающий статистическую информацию о проекте.</p>
<ul>
<li>Автор: <a href="http://sebastian-bergmann.de/">Sebastian Bergmann</a></li>
<li>Официальный сайт: <a href="http://github.com/sebastianbergmann/phploc">http://github.com/sebastianbergmann/phploc</a></li>
<li>Официальный PEAR канал: <a href="http://pear.phpunit.de/">http://pear.phpunit.de/</a></li>
<li>Текущая версия: 1.5.1 (stable)</li>
</ul>
<h6><strong>phpdcd</strong></h6>
<p>Детектор неиспользуемого кода (Dead Code Detector) для PHP. Он  сканирует PHP проект на предмет всех определенных функций и методов и  сообщает о них как о неиспользуемых если из вызов не встречается хотя бы  однажды</p>
<ul>
<li>Автор: <a href="http://sebastian-bergmann.de/">Sebastian Bergmann</a></li>
<li>Официальный сайт: <a href="http://github.com/sebastianbergmann/phpdcd">http://github.com/sebastianbergmann/phpdcd</a></li>
<li>Официальный PEAR канал: <a href="http://pear.phpunit.de/">pear.phpunit.de</a></li>
<li>Текущая версия: 0.9.2 (beta)</li>
</ul>
<h6><strong>Padawan</strong></h6>
<p>Инструмент для обнаружения антипаттернов, обходных путей и прочих  неприятностей.</p>
<ul>
<li>Автор: <a href="http://sebastian-bergmann.de/">Sebastian Bergmann</a></li>
<li>Официальный сайт: <a href="http://github.com/sebastianbergmann/padawan">http://github.com/sebastianbergmann/padawan</a></li>
<li>Официальный PEAR канал: неизвестен</li>
<li>Текущая версия: неизвестна</li>
</ul>
<h6><strong>PHP_CachegrindParser</strong></h6>
<p>Обработчик для cachegrind файлов создающий xml отчеты для последующего  использования в CI.</p>
<ul>
<li>Автор: <a href="http://www.mayflower.de/">Mayflower GmbH</a></li>
<li>Официальный сайт: <a href="http://github.com/mayflowergmbh/PHP_CachegrindParser">http://github.com/mayflowergmbh/PHP_CachegrindParser</a></li>
<li>Официальный PEAR канал: неизвестен</li>
<li>Текущая версия: неизвестна</li>
</ul>
<p><strong>Источник статьи</strong><br />
<a href="http://habrahabr.ru/blogs/php/91777/">Хабрахабр: PHP &#8211; Обеспечение качества программного продукта</a></p>
<p><strong>Что ещё можно почитать:</strong><br />
<a href="http://sebastian-bergmann.de/software/">http://sebastian-bergmann.de/software/</a><br />
<a href="http://manuel-pichler.de/">http://manuel-pichler.de/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2010/04/23/quality-assurance-in-php-projects-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ZfConf 2010 &#8211; первая в России конференция по Zend Framework</title>
		<link>http://tigor.com.ua/blog/2010/02/01/zfconf/</link>
		<comments>http://tigor.com.ua/blog/2010/02/01/zfconf/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 09:19:21 +0000</pubDate>
		<dc:creator>ingvar</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend framework]]></category>
		<category><![CDATA[zfconf]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=1440</guid>
		<description><![CDATA[В конце этого марта в Санкт-Петербурге пройдет первая в России конференция по Zend Framework. На днях закончился прием тезисов по планируемым докладам. В состав докладчиков вошли ведущие участники русскоязычного сообщества ZF, опытнейшие специалисты и лично один из создателей Zend Framework.
На данный момент уже открыта предварительная регистрация на конференцию. Для решения ряда вопросов организаторам очень важно [...]]]></description>
			<content:encoded><![CDATA[<p>В конце этого марта в Санкт-Петербурге пройдет первая в России <a href="http://www.zfconf.ru/"><strong>конференция по Zend Framework</strong></a>. На днях закончился прием тезисов по планируемым докладам. В состав докладчиков вошли ведущие участники русскоязычного сообщества ZF, опытнейшие специалисты и лично один из создателей Zend Framework.</p>
<p>На данный момент уже открыта <a href="http://www.zfconf.ru/pre-registration.php">предварительная регистрация</a> на конференцию. Для решения ряда вопросов организаторам очень важно сейчас понять приблизительное количество человек, которые смогут посетить конференцию или принять участие в ней.</p>
<p>Каждый предстоящий доклад возможно обсудить на форуме ZF-сообщества. Ваше мнение очень важно для авторов!</p>
<p><span id="more-1440"></span></p>
<p>Планируемые <a href="http://zendframework.ru/forum/index.php?board=32.0">доклады</a>:</p>
<ul>
<li> Жизненный цикл предложений (proposals) в проекте Zend Framework (Александр Веремьев, Zend Technologies)</li>
<li>Zend_Search_Lucene в деталях (Александр Веремьев, Zend Technologies)</li>
<li>Zend Framework и производительность (Александр Махомет, ZendFramework.ru)</li>
<li>Zend Framework и MVC, «толстая» модель (Александр Стешенко, Norada Corporation)</li>
<li>ФотоСтрана.ru: Прототипирование с использованием ZF (Леонид Жаворонков, ФотоСтрана.ru)</li>
<li>Использование очередей сообщений в повседневных проектах (Денис Баклыков, Обновление)</li>
<li>Zend Framework и Doctrine (Степан Танасийчук, stfalcon.com)</li>
<li>Zend Framework и мультиязычность (Степан Танасийчук, stfalcon.com)</li>
<li>История проекта e-Штаб (Анатолий Ларин, e-Легион)</li>
<li>Что нового несет нам Zend Framework 2.0? (Надежда Блинова, Георгий Туревич, Wizartech)</li>
<li>Интеграция Zend Framework c Javascript-фрэймворками jQuery и Dojo Toolkit (Георгий Туревич, Wizartech)</li>
</ul>
<p>Смело обсуждайте доклады и регистрируйтесь!</p>
<p>За последними новостями можно следить здесь:<br />
RSS-канал: <a href="http://feeds.feedburner.com/zfconf">feeds.feedburner.com/zfconf</a><br />
Twitter: <a href="http://twitter.com/zfconf">@zfconf</a><br />
Группа Вконтакте: <a href="http://vkontakte.ru/club14951507">vkontakte.ru/club14951507</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2010/02/01/zfconf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XHprof: производительность популярных PHP фреймворков</title>
		<link>http://tigor.com.ua/blog/2009/12/17/xhprof-php-framework-performance-comparision/</link>
		<comments>http://tigor.com.ua/blog/2009/12/17/xhprof-php-framework-performance-comparision/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 21:44:08 +0000</pubDate>
		<dc:creator>ingvar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[highload]]></category>
		<category><![CDATA[xhprof]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=1363</guid>
		<description><![CDATA[В первом посте про XHProf: XHProf – профайлер PHP от Facebook, рассказывалось, что это за инструмент, как его установить, настроить и использовать. Решил провести небольшой тест производительности популярных фреймворков, используя данные XHProf.
Цель теста &#8211; посмотреть, какие данные получим по таким показателям, как:

Wall Time (a.k.a. Elapsed time or wall clock time)
CPU (CPU time in user space [...]]]></description>
			<content:encoded><![CDATA[<p>В первом посте про XHProf: <a href="http://tigor.com.ua/blog/2009/12/13/profiling-php-with-xhprof/">XHProf – профайлер PHP от Facebook</a>, рассказывалось, что это за инструмент, как его установить, настроить и использовать. Решил провести небольшой тест производительности популярных фреймворков, используя данные XHProf.</p>
<p><strong>Цель теста &#8211; посмотреть, какие данные получим по таким показателям, как:</strong></p>
<ul>
<li>Wall Time (a.k.a. Elapsed time or wall clock time)</li>
<li>CPU (CPU time in user space + CPU time in kernel space)</li>
<li>MemUse (Memory usage)</li>
<li>PeakMemUse (Peak memory usage)</li>
<li>Number of Function Calls</li>
</ul>
<p><span id="more-1363"></span></p>
<h3><strong>Какие фреймворки протестировали?</strong></h3>
<ul>
<li>Yii 1.0.11</li>
<li>Yii 1.1.rc</li>
<li><a href="http://www.yiiframework.com/doc/guide/ru/topics.performance#---------------------------x-9x">Yiilite</a> 1.0.11 / 1.1.rc (Bootstrap файл, где собраны вместе часто используемые классы. Плюс все комментарии и выражения трассировки вырезаются)</li>
<li>Symfony 1.2.11</li>
<li>Symfony 1.4.2</li>
<li>Zend Framework 1.9.6</li>
<li>DooPHP 1.2</li>
<li>Codeigniter 1.7.2</li>
<li>Kohana 2.3.4</li>
<li>Kohana 3.0.3</li>
<li>Cakephp 1.2.5 (тормозил больше всех, видно в 1.3.0 починили)</li>
<li>Cakephp 1.3.0 alpha</li>
<li>Recess 0.20 (был взят ради спортивного интереса, т.к. позиционирует себя как: Easy, Reliable, Fast, Extensible)</li>
</ul>
<p>Почему именно эти PHP фреймворки? Эти проекты интересные, популярные <img src='http://tigor.com.ua/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  и все ещё развиваются.</p>
<h3><strong>Как проводилось тестирование?</strong></h3>
<p>Для получения результатов выполнялось около 10 выборок по каждому фреймворку. И в качестве данных использовались<br />
лучшие результаты с наименьшими задержками времени. </p>
<p><strong>Условия тестирования</strong></p>
<ul>
<li>Операционная система: FreeBSD 8.0</li>
<li>Web сервер: Apache httpd 2.2.13</li>
<li>PHP 5.2.11 + APC + XHProf + много других модулей</li>
<li>CPU: VIA C7 1500MHz</li>
<li>Оперативная память: 1GB</li>
<li>Винчестер: 250 GB 5400 RPM 8MB SATA</li>
</ul>
<p><strong>Режимы тестирования</strong></p>
<ol>
<li>Выключенный APC</li>
<li>С включенным APC (apc.stat = 1)</li>
<li>С включенным APC (apc.stat = 0)</li>
</ol>
<blockquote><p>
<strong>&laquo;apc.stat = 1&#8243;</strong> &#8211; штатный режим APC, проверяется дата модификации файла, и если она изменилась, то кеш для файлов обновляется. В случае, если <strong>&laquo;apc.stat = 0&#8243;</strong>, то проверка не проводится, что положительно влияет на производительность. НО в этом случае, пока не сбросите кеш вручную, данные не обновятся.
</p></blockquote>
<p><strong>Тестируемые приложения</strong></p>
<p>Для каждого фреймворка было написано свое приложение. Каждое приложение выводит строку &laquo;Hello world!&raquo;. Все настройки фреймворков использовались по умолчанию. За основу была взята идея <a href="http://code.google.com/p/phpmark/">phpmark</a>.</p>
<h3><strong>Результат #1. APC выключен</strong></h3>
<p><img src="http://tigor.com.ua/blog/wp-content/uploads/2009/12/1_xhprof_without_apc.png" alt="1_xhprof_without_apc" title="1_xhprof_without_apc" width="725" height="400" class="alignnone size-full wp-image-1405" /></p>
<p>Yiilite не рекомендуется использовать без кеширования байткода (APC, XCache, eAccelerator), что собственно и видно по результатам теста.<br />
<br/></p>
<h3><strong>Результат #2. APC включен (apc.stat = 1)</strong></h3>
<p><img src="http://tigor.com.ua/blog/wp-content/uploads/2009/12/2_xhprof_with_apc.png" alt="2_xhprof_with_apc" title="2_xhprof_with_apc" width="725" height="400" class="alignnone size-full wp-image-1407" /></p>
<p>А тут наоборот, Yiilite отрабатывает быстрее, но потребляет больше памяти.<br />
<br/></p>
<h3><strong>Результат #3. APC включен (apc.stat = 0)</strong></h3>
<p><img src="http://tigor.com.ua/blog/wp-content/uploads/2009/12/3_xhprof_with_apc_stat_eq_0.png" alt="3_xhprof_with_apc_stat_eq_0" title="3_xhprof_with_apc_stat_eq_0" width="725" height="400" class="alignnone size-full wp-image-1408" /></p>
<p>Очень интересные цифры получаются. Например, Wall Time (ms) у Zend Framework 1.9.6 уменьшилось практически на 50%, для других на 5-30 мс. Но режим этот не всем подойдет, и к тому же тут свои нюансы, связанные с очищением кеша.<br />
<br/></p>
<h3><strong>Сравниваем результаты &laquo;Wall Time (ms)&raquo; для всех режимов</strong></h3>
<p><img src="http://tigor.com.ua/blog/wp-content/uploads/2009/12/4_xhprof_wall_time_comparison.png" alt="4_xhprof_wall_time_comparison" title="4_xhprof_wall_time_comparison" width="680" height="400" class="alignnone size-full wp-image-1413" /></p>
<p><img src="http://tigor.com.ua/blog/wp-content/uploads/2009/12/5_xhprof_wall_time_comparison_graph_2.png" alt="5_xhprof_wall_time_comparison_graph_2" title="5_xhprof_wall_time_comparison_graph_2" width="968" height="701" class="alignnone size-full wp-image-1414" /></p>
<p>Как можно убедиться, использование APC очень положительно сказывается на производительсности, время загрузки страницы увеличивается в разы для некоторых фреймворков.<br />
<br/></p>
<h3><strong>Сравниваем результаты &laquo;MemUse (kb)&raquo; для всех режимов</strong></h3>
<p><img src="http://tigor.com.ua/blog/wp-content/uploads/2009/12/6_xhprof_mem_use_comparison_graph.png" alt="6_xhprof_mem_use_comparison_graph" title="6_xhprof_mem_use_comparison_graph" width="952" height="640" class="alignnone size-full wp-image-1415" /></p>
<p>Тут видно положительный эффект от использование APC &#8211; потребления памяти уменьшается в раза 2-3.<br />
<br/></p>
<h3><strong>Update &#8211; Yii with View</strong></h3>
<p>Для Yii было заменено приложение, чтобы задействовать View. Все графики обновлены. Если сравнивать с предыдущими значениями Yii, то новые увеличились на 5-10 мс.</p>
<h3><strong>Выводы</strong></h3>
<p>Вот так с помощью XHProf стало видно, кто у нас тяжеловес из PHP фреймворков <img src='http://tigor.com.ua/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . О чем это свидетельствует? Да ровным счетом ничего &#8211; это всего лишь &laquo;Hello World!&raquo; да и железка слабовата&#8230; <img src='http://tigor.com.ua/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Если взять реальный сайт с БД, его сложной бизнес логикой, то цифры будут совсем другие.</p>
<p>Я в своей работе использую Symfony 1.2.11. Да, он тяжеловат, но его плюсы перекрывают все его минусы, по моему мнению. К тому же, если взять нормальный сервачок (Opteron X2 2.2 GHz, 8 GB + хорошие веники) вместо VIA C7 1500MHz, то тот же самый &laquo;Hello World!&raquo; вместо 177 мс загрузится на Opteron за 23 мс, а реальный сайт &#8211; 146 мс. Вот так! Но это уже другая история.</p>
<p>А вот Yii Framework нахожу очень интересным и серьезным проектом. Осталось его испытать в боевых условиях.</p>
<h3><strong>Ссылке по теме</strong></h3>
<ul>
<li><a href="http://mirror.facebook.net/facebook/xhprof/doc.html">XHProf Documentation</a></li>
<li><a href="http://tigor.com.ua/blog/2009/12/13/profiling-php-with-xhprof/ ">XHProf – профайлер PHP от Facebook</a></li>
<li><a href="http://tigor.com.ua/blog/2009/06/10/php-frameworks/">Список современных PHP-фреймворков – смотрим и выбираем</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2009/12/17/xhprof-php-framework-performance-comparision/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>XHprof &#8211; профайлер PHP от Facebook</title>
		<link>http://tigor.com.ua/blog/2009/12/13/profiling-php-with-xhprof/</link>
		<comments>http://tigor.com.ua/blog/2009/12/13/profiling-php-with-xhprof/#comments</comments>
		<pubDate>Sun, 13 Dec 2009 15:32:05 +0000</pubDate>
		<dc:creator>ingvar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Отладка]]></category>
		<category><![CDATA[highload]]></category>
		<category><![CDATA[xhprof]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=1325</guid>
		<description><![CDATA[Профилирование кода позволяет выявить медленные участки в коде, что позволит в случае необходимости устранить их.
Новый PHP профайлер XHprof от компании Facebook &#8211; это альтернатива Xdebug (PHP профайлер Xdebug). XHprof был разработан специально для Facebook и начиная с март 2009 года его исходный код стал доступен для скачивания.

Как работает XHprof?
XHProf работает по принципу декомпозиции системы на [...]]]></description>
			<content:encoded><![CDATA[<p>Профилирование кода позволяет выявить медленные участки в коде, что позволит в случае необходимости устранить их.</p>
<p>Новый PHP профайлер XHprof от компании Facebook &#8211; это альтернатива Xdebug (<a href="http://tigor.com.ua/blog/2008/07/21/php-profiler-debugger-xdebug/">PHP профайлер Xdebug</a>). XHprof был разработан специально для Facebook и начиная с март 2009 года его исходный код стал доступен для скачивания.</p>
<p><span id="more-1325"></span></p>
<h3><strong>Как работает XHprof?</strong></h3>
<p>XHProf работает по принципу декомпозиции системы на вызовы функций (методов) и построения статистики в разрезе их ресурсопотребления. В результате получаем информацию: количество выделяемой памяти, количество вызовов функций, время исполнения и т.д.</p>
<h3><strong>Установка XHProf</strong></h3>
<p>С марта 2009 года XHprof доступен как пакет <a href="http://pecl.php.net/package/xhprof">PECL</a>, поэтому его установка не составит особого труда. Для Windows пакет не доступен.</p>
<pre class="brush: bash;">
# pecl search xhprof
Retrieving data...0%
Matched packages, channel pecl.php.net:
=======================================
Package Stable/(Latest) Local
xhprof  0.9.2 (beta)          XHProf: A Hierarchical Profiler for PHP
</pre>
<p>Т.к. пакет xhprof находится в стадии beta, то нужно разрешить его установку:</p>
<pre class="brush: bash;">
# pecl config-get preferred_state
stable

# pecl config-set preferred_state beta
# pecl config-get preferred_state
beta
</pre>
<p>Если попытаться установить пакет через PECL, то получим ошибку:</p>
<pre class="brush: bash;">
# pecl install xhprof

downloading xhprof-0.9.2.tar ...
Starting to download xhprof-0.9.2.tar (Unknown size)
....................................................................done: 1,506,816 bytes
11 source files, building
running: phpize
Cannot find config.m4.
Make sure that you run '/usr/local/bin/phpize' in the top level source directory of the module

ERROR: `phpize' failed
</pre>
<p>Поэтому выполняем следующие шаги:</p>
<pre class="brush: bash;">
# wget http://pecl.php.net/get/xhprof-0.9.2.tgz
# tar xvf xhprof-0.9.2.tgz
# cd ./xhprof-0.9.2/extension/
# phpize
# ./configure --with-php-config=/usr/local/bin/php-config
# make

# make install
Installing shared extensions:     /usr/local/lib/php/20060613/

# make test
</pre>
<p>Удалять папку xhprof-0.9.2 не следует, т.к. там содержатся утилиты GUI для визуального представления информации профайлера.</p>
<p>Подключаем модуль xhprof к PHP &#8211; редактируем файл php.ini (добавляем в конец файла):</p>
<pre class="brush: plain;">
[xhprof]
extension=xhprof.so
xhprof.output_dir=&quot;/var/tmp/xhprof&quot;
</pre>
<p>Для папки <strong>&laquo;/var/tmp/xhprof&raquo;</strong> должен быть доступ на запись, т.к. туда будут сохраняться результаты профайлинга.</p>
<p>Перезагрузите Apache. При вызове phpinfo() появится информация, что подключен модуль xhprof &#8211; значит все работает. </p>
<h3><strong>Настройка XHProf UI (GUI)</strong></h3>
<p>В пакет XHprof входит очень удобный интерфейс для анализа отчетов профилирования. XHprof позволяет строить отчеты, как в текстовом так и графическом ввиде.</p>
<p>В установочной папке xhprof-0.9.2 Вы найдете папку xhprof_html и xhprof_lib, которые нам понадобятся:<br />
&bull; xhprof_html &#8211; доступ к GUI<br />
&bull; xhprof_lib &#8211; библиотека для отображения и анализа кода (computing flat profile info, computing diffs, aggregating data from multiple runs, etc.). </p>
<p>Папку xhprof_lib размещаем в <strong>/usr/local/share/php/</strong> или <strong>/usr/local/lib/php/</strong> в зависимости от ОС. Таким образом будет доступ к библиотеки будет глобальный. В нашем случае получится: <strong>/usr/local/share/php/xhprof_lib/</strong>. Или как вариант папку xhprof_lib можно положить в наш проект.</p>
<p>В зависимости от того как Вы настроете доступ к GUI xhprof, нужно положить xhprof_html в соответствующее место. К примеру, можно создать субдомен http://xhprof.project/ или положить в корень проекта http://xhprof/.</p>
<h3><strong>Небольшой пример использования</strong></h3>
<p>В качестве примера взят пример с сайта highload.com.ua:</p>
<pre class="brush: php;">
function user_array_intersect( $a, $b ) {
  $res = array();

  foreach ( $a as $k =&gt; $v )
  {
    if ( in_array($v, $b) )
    {
      $res[] = $v;
    }
  }

  return $res;
}

function execute()
{
  $a = range(rand(100, 300), rand(700, 900));
  $b = range(rand(100, 300), rand(700, 900));

  $r1 = user_array_intersect($a, $b);
  $r2 = array_intersect($a, $b);
}

# Инициализируем профайлер - будем считать и процессорное время и потребление памяти
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

# Выполняем &quot;программу&quot;
execute();

# Останавливаем профайлер
$xhprof_data = xhprof_disable();

# Сохраняем отчет и генерируем ссылку для его просмотра
include_once &quot;xhprof_lib/utils/xhprof_lib.php&quot;;
include_once &quot;xhprof_lib/utils/xhprof_runs.php&quot;;
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs-&gt;save_run($xhprof_data, &quot;xhprof_test&quot;);
echo &quot;Report: http://xhprof/index.php?run=$run_id&amp;source=xhprof_test&quot;; # Хост, который Вы настроили ранее на GUI профайлера
echo &quot;\n&quot;;
</pre>
<p>В этом скрипте мы сравним отличие в эффективности работы встроенной функции array_intersect и ее самописного клона user_array_intersect. После описания функций мы подключили профайлер для генерации и сохранения отчета. Посмотрим на отчет:</p>
<p><img src="http://tigor.com.ua/blog/wp-content/uploads/2009/12/screenshot-xhprof-hierarchical-profiler-report-mozilla-firefox.png" alt="screenshot-xhprof-hierarchical-profiler-report-mozilla-firefox" title="screenshot-xhprof-hierarchical-profiler-report-mozilla-firefox" width="550" height="218" class="alignnone size-full wp-image-1344" /></p>
<p>Из отчета видно, что эффективность собственной реализации функции array_intersect в два раза меньше встроенной (еще одно напоминание об использовании стандартных средств прежде всего!). Небольшая справка по терминологии отчетов:</p>
<p>&bull; <strong>Incl[usive] Time</strong> &#8211; время, потраченное на функцию и на все функции, вызванные из нее<br />
&bull; <strong>Excl[usive] Time</strong> &#8211; время, потраченное на функцию без учета времени на вложенные функции</p>
<p>На скриншоте показана только часть отчета, кроме этих показателей отчет также содержит статистику по процессорным затратам и использованной памяти.</p>
<h3><strong>Графические отчеты</strong></h3>
<p>XHprof позволяет строить графические отчеты. Для построения он использует внешний инструмент Graphviz, поэтому убедитесь, что он установлен. Графический отчет вышеуказанного скрипта выглядит так:</p>
<p><img src="http://tigor.com.ua/blog/wp-content/uploads/2009/12/callgraphphp.png" alt="callgraphphp" title="callgraphphp" width="500" height="432" class="alignnone size-full wp-image-1346" /></p>
<p>Графический отчет позволяет визуально оценить ресурсоемкость каждой функции (красный должен привлечь внимание!). Как видим, в  примере самой затратной функцией для ресурсов стала in_array(), которая сама по себе не является проблемой но говорит о плохом техническом решении.</p>
<h3><strong>Профилирование production проектов</strong></h3>
<p>XHprof позволяет профилировать не только отдельные участки кода но и production проекты. Т.к. профилирование проектов в среде production процесс ресурсоемкий, то главный тут критерий &#8211; производительность. И XHprof тут прекрасно справляется, т.к. создан он был именно для таких целей. Во-первых XHprof написан на C, во-вторых имеет ряд настроек:</p>
<p>&bull; Таймер CPU на Linux системах имеет большой оверхед, поэтому разработчики рекомендуют использовать профайлер в режиме &laquo;elapsed time + memory&raquo;:</p>
<pre class="brush: php;">
  // elapsed time profiling (default) + memory profiling
  xhprof_enable(XHPROF_FLAGS_MEMORY);
</pre>
<p>&bull; Сбор данных профайлера будет весьма точно отражать реальную картину, если его запускать не каждый раз, а случайно и равнораспределенно, например для запуска каждый сотый раз:</p>
<pre class="brush: php;">
   if (mt_rand(1, 100) == 1) {
     xhprof_enable(XHPROF_FLAGS_MEMORY);
     $xhprof_on = true;
   }
  ...
   if ($xhprof_on) {
     $xhprof_data = xhprof_disable();
   }
</pre>
<p>&bull; Режим Lightweight Sampling &#8211; в этом режиме профилирование выполняется в течении короткого промежутка во времени (сэмплами) &#8211; 0.1 секунды</p>
<h3><strong>Пример профилирования production проекта</strong></h3>
<p>В качестве примера используем проект на Yii &#8211; Hello World!</p>
<p>Наш проект http://project/.<br />
GUI нашего профайлера (содержимое папки xhprof_html) http://xhprof/.<br />
xhprof_lib находится в &laquo;/usr/local/share/php/xhprof_lib&raquo;.</p>
<p>Создаем 2 файла (header.php и footer.php).</p>
<p><strong>header.php</strong></p>
<pre class="brush: php;">
&lt;?php

if (extension_loaded('xhprof')) {
  // Способ 1 - файлы лежат в проекте
  // include_once '/usr/local/share/php/xhprof_lib/utils/xhprof_lib.php';
  // include_once '/usr/local/share/php/xhprof_lib/utils/xhprof_runs.php';

  // Способ 2 - файлы лежат в /usr/local/share/php/xhprof_lib
  include_once dirname(__FILE__) . '/xhprof_lib/utils/xhprof_lib.php';
  include_once dirname(__FILE__) . '/xhprof_lib/utils/xhprof_runs.php';
  xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}
</pre>
<p><strong>footer.php</strong></p>
<pre class="brush: php;">
&lt;?php

if (extension_loaded('xhprof')) {
  $profiler_namespace = 'myapp';  // namespace for your application
  $xhprof_data = xhprof_disable();
  $xhprof_runs = new XHProfRuns_Default();
  $run_id = $xhprof_runs-&gt;save_run($xhprof_data, $profiler_namespace);

  // url to the XHProf UI libraries (change the host name and path)
  $profiler_url = sprintf('http://' . $_SERVER['SERVER_NAME'] . '/xhprof/index.php?run=%s&amp;source=%s', $run_id, $profiler_namespace);

  // Можем сделать защиту по айпи, или добавить $_GET параметр
  if (in_array($_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1')))
  {
    // На нашей странице появится ссылка &quot;Profiler output&quot;, которая ведет на GUI XHprof с уникальными идентификатором отчета
    echo '&lt;br/&gt;&lt;br/&gt;&lt;a href=&quot;'. $profiler_url .'&quot; target=&quot;_blank&quot;&gt;Profiler output&lt;/a&gt;';
  }
}
</pre>
<p>Для внедрения профайлера в наш проект есть 2 способа:</p>
<p>1) Создаем файл .htaccess</p>
<pre class="brush: plain;">
php_value auto_prepend_file ../xhprof/header.php
php_value auto_append_file ../xhprof/footer.php
</pre>
<p>2) Добавляем вызов в файла в наш index.php</p>
<pre class="brush: php;">
&lt;?php

include('xhprof/header.php');

// include Yii bootstrap file
require_once(dirname(__FILE__).'/framework/yii.php');

// create a Web application instance and run
Yii::createWebApplication()-&gt;run();

include('xhprof/footer.php');
</pre>
<p>Загружаем страницу сайта. Внизу страницы появляется ссылка &laquo;Profiler output&raquo;, которая ведет на GUI XHprof с уникальными идентификатором отчета. Каждый раз, когда мы обновляем страницу отчет перегенирируется и идентификатор изменится.</p>
<p>Получаем отчет:</p>
<p><img src="http://tigor.com.ua/blog/wp-content/uploads/2009/12/XHProf-Hierarchical-Profiler-Report_12607101.jpg" alt="XHProf- Hierarchical Profiler Report_12607101" title="XHProf- Hierarchical Profiler Report_12607101" width="700" height="320" class="alignnone size-full wp-image-1354" /></p>
<p><strong>Показатели:</strong><br />
&bull; Total Incl. Wall Time (microsec):	18,710 microsecs (время затраченное на выполнение функций с учетом ожидания ответов от сокетов, файловой системы и других ресурсов  )<br />
&bull; Total Incl. CPU (microsecs):	16,309 microsecs (время затраченное на выполнение функций)<br />
&bull; Total Incl. MemUse (bytes):	527,604 bytes (использование памяти)<br />
&bull; Total Incl. PeakMemUse (bytes):	529,428 bytes (пиковое использование памяти)<br />
&bull; Number of Function Calls:	179 (количество вызовов функций)</p>
<p><strong>Что почитать:</strong><br />
&bull; <a href="http://mirror.facebook.net/facebook/xhprof/doc.html">XHProf Documentation</a><br />
&bull; <a href="http://pecl.php.net/package/xhprof">Pecl: xhprof</a><br />
&bull; <a href="http://techportal.ibuildings.com/2009/12/01/profiling-with-xhprof/">Profiling with XHProf</a><br />
&bull; <a href="http://highload.com.ua/index.php/2009/08/21/xhprof-%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-php-%D0%BE%D1%82-facebook/">XHprof &#8211; профилирование PHP от Facebook</a><br />
&bull; <a href="http://www.antonoff.info/php/code-profiling">Профилирование PHP-кода</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2009/12/13/profiling-php-with-xhprof/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>ORM в мире PHP</title>
		<link>http://tigor.com.ua/blog/2009/10/21/orm-in-the-php-world/</link>
		<comments>http://tigor.com.ua/blog/2009/10/21/orm-in-the-php-world/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 20:50:38 +0000</pubDate>
		<dc:creator>ingvar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=1297</guid>
		<description><![CDATA[ORM (англ. Object-relational mapping, русск. Объектно-реляционная проекция) — запись объектов программы в реляционную базу данных, отображение объекта и его представления в виде набора таблиц. &#8211; Википедия: ORM 
В своей работе используем PHP Framework Symfony 1.2.9 и Propel 1.3, но планируем перейти на Symfony 1.3 + Doctrine. У меня возник вопрос: &#171;А какие еще PHP ORM [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong>ORM</strong> (англ. Object-relational mapping, русск. Объектно-реляционная проекция) — запись объектов программы в реляционную базу данных, отображение объекта и его представления в виде набора таблиц. &#8211; <a href="http://ru.wikipedia.org/wiki/ORM">Википедия: ORM</a> </p></blockquote>
<p>В своей работе используем PHP Framework Symfony 1.2.9 и Propel 1.3, но планируем перейти на Symfony 1.3 + Doctrine. У меня возник вопрос: &laquo;А какие еще PHP ORM разработаны?&raquo;. Немного погуглив &#8211; получили следующую подборку. Многие проекты новые и ещё альфа/бета версии, но в любом случае уже есть возможность из чего выбрать.</p>
<p>&bull; <a href="http://propel.phpdb.org/trac/">Propel</a><br />
&bull; <a href="http://www.doctrine-project.org/">Doctrine</a><br />
&bull; <a href="http://getdorm.com/">dOrm</a><br />
&bull; <a href="http://www.outlet-orm.org/site/">Outlet PHP ORM</a><br />
&bull; <a href="http://www.redbeanphp.com/">RedBean</a><br />
&bull; <a href="http://code.google.com/p/php-orm/"> phpORM</a><br />
&bull; <a href="http://phpdatamapper.com/">phpDataMapper</a><br />
&bull; <a href="http://www.qcodo.com/">Qcodo</a><br />
&bull; <a href="http://www.coughphp.com/">CoughPHP</a><br />
&bull; <a href="http://phplinq.codeplex.com/">PHPLinq</a><br />
&bull; <a href="http://sourceforge.net/projects/phplightorm/">LightOrm for PHP</a>, <a href="http://freshmeat.net/projects/lightorm">LightOrm on Freshmeat</a><br />
&bull; <a href="http://www.phpactiverecord.org/">PHP ActiveRecord</a>, <a href="http://github.com/kla/php-activerecord/">PHP ActiveRecord on GitHub</a><br />
&bull; <a href="http://www.phpersistence.online.fr/">phpersistence</a><br />
&bull; <a href="http://www.php-rocks.com/">Rocks PHP Library</a><br />
&bull; <a href="http://www.schizofreend.nl/pork.dbobject/">Pork.dbObject</a><br />
&bull; <a href="http://www.repose-php.org/">Repose</a><br />
&bull; <a href="http://www.greaterscope.net/projects/ORMer">ORMer</a><br />
&bull; <a href="http://porte.adaltas.com/">Porte</a><br />
&bull; <a href="http://code.google.com/p/dabase/">DaBase</a>, <a href="http://habrahabr.ru/blogs/php/72731/">DaBase — не очередная ORM для PHP</a></p>
<p><span id="more-1297"></span></p>
<p><strong>ORM в разных PHP Framework:</strong><br />
&bull; <a href="http://framework.zend.com/wiki/display/ZFPROP/Zend_Generator_Orm+-+Thomas+VEQUAUD">Zend Framework Zend_Db_Mapper</a><br />
&bull; <a href="http://code.google.com/p/zend-framework-orm/">Zend Framework Db Table ORM</a><br />
&bull; <a href="http://docs.kohanaphp.com/libraries/orm">Kohana ORM</a><br />
&bull; <a href="http://ciex.levallois.biz/">CIEXtended: based on CodeIgniter</a><br />
&bull; <a href="http://xyster.libreworks.net/">Xyster</a><br />
&bull; <a href="http://solarphp.com/package/Solar_Sql_Model">Solar’s Solar_Sql_Model</a></p>
<p><strong>Active Record (AR) в разных PHP Framework:</strong><br />
&bull; <a href="http://www.yiiframework.com/doc/guide/database.ar">Yii Active Record</a><br />
&bull; <a href="http://book.cakephp.org/view/66/Models">CakePHP</a></p>
<p><strong>Что можно почитать:</strong><br />
&bull; <a href="http://mikhailstadnik.com/few-words-about-orm">ORM и с чем его едят</a><br />
&bull; <a href="http://wiki.agiledev.ru/doku.php?id=ooad:dp:data_mapper">Шаблон DataMapper</a><br />
&bull; <a href="http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software#PHP">List of object-relational mapping software: PHP</a><br />
&bull; <a href="http://www.libhound.com/databases/php-object-relational-mapping-frameworks">Comprehensive list of the object relational mapping tools and frameworks. part one: php</a><br />
&bull; <a href="http://maggienelson.com/2009/05/orm-in-the-php-world/">ORM in the PHP World</a><br />
&bull; <a href="http://nepalphp.org/content/orm-php">ORM in PHP</a><br />
&bull; <a href="http://www.derivante.com/2009/05/14/php-activerecord-with-php-53/">PHP ActiveRecord with PHP 5.3</a><br />
&bull; <a href="http://sourceforge.net/apps/trac/phplightorm/wiki/ruhome">LightOrm: Описание на русском языке</a><br />
&bull; <a href="http://www.derivante.com/2009/05/19/php-activerecord-available-for-beta-testing/">PHP ActiveRecord Available for Beta Testing</a><br />
&bull; <a href="http://trac.symfony-project.org/wiki/ConvertingPropelProjectToDoctrine">Symfony Converting Propel Project To Doctrine</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2009/10/21/orm-in-the-php-world/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Список современных PHP-фреймворков &#8211; смотрим и выбираем</title>
		<link>http://tigor.com.ua/blog/2009/06/10/php-frameworks/</link>
		<comments>http://tigor.com.ua/blog/2009/06/10/php-frameworks/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 13:09:50 +0000</pubDate>
		<dc:creator>ingvar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[frameworks]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=1252</guid>
		<description><![CDATA[Источник перевода: Современные PHP-фреймворки &#8211; полный список лидеров.
Оригинал на анг. языке: 16 PHP Frameworks To Consider For Your Next Project.
Ребята из phpinside молодцы, т.к. расширили список оригинальной статьи и добавили комментарии. В первоначальной статье не было таких фреймворков, как onPHP, Yii, Pluf и других. В итоге имеем на сегодня 22 фреймворка на языке PHP, что [...]]]></description>
			<content:encoded><![CDATA[<p>Источник перевода: <a href="http://phpinside.ru/?q=node/841">Современные PHP-фреймворки &#8211; полный список лидеров</a>.<br />
Оригинал на анг. языке: <a href="http://www.sitepoint.com/blogs/2009/06/09/16-php-frameworks/">16 PHP Frameworks To Consider For Your Next Project</a>.</p>
<p>Ребята из phpinside молодцы, т.к. расширили список оригинальной статьи и добавили комментарии. В первоначальной статье не было таких фреймворков, как onPHP, Yii, Pluf и других. В итоге имеем на сегодня 22 фреймворка на языке PHP, что впечатляет!</p>
<p><span id="more-1252"></span></p>
<ol>
<li><strong><a href="http://www.agavi.org/" target="_blank">Agavi</a></strong>. PHP5 фреймворк, вариант реализации проекта Mojavi.</li>
<li><strong><a href="http://www.akelos.org/" target="_blank">Akelos</a></strong>. Порт Ruby on Rails для PHP. Особенно подходит для небольших проектов. Вокруг фреймворка сформировалось активное сообщество.</li>
<li><strong><a href="http://www.cakephp.org/" target="_blank">CakePHP</a></strong>. Популярный фреймворк, особенностью которого является стремление к быстрому развёртыванию приложений.</li>
<li><strong><a href="http://www.codeigniter.com/" target="_blank">CodeIgniter</a></strong>. Небольшой по размеру, но очень быстрый фреймворк с отличной документацией и большим сообществом.</li>
<li><strong><a href="http://ez.no/ezcomponents" target="_blank">eZ Components</a></strong>. Набор разноцелевых компонентов. Если вы знакомы с ezPublish CMS, значит знакомы и с этими компонентами.</li>
<li><strong><a href="http://flow3.typo3.org/" target="_blank">FLOW3</a></strong>. Фреймворк от создателей TYPO3. Реализованы различные современные концепции, включая аспектно-ориентированный подход.</li>
<li><strong><a href="http://www.phpfuse.net/" target="_blank">Fuse</a></strong>. Ориентиром для этого фреймворка послужили RoR и CakePHP, но, конечно, с добавлением собственных идей.</li>
<li><strong><a href="http://www.horde.org/horde/" target="_blank">Horde</a></strong>. Проект вырос из набора приложений для работы с Email и Групп. Ориентирован на создание приложений на языках, отличных от английского.</li>
<li><strong><a href="http://kohanaphp.com/" target="_blank">Kohana</a></strong>. Ответвление от проекта CodeIgniter, обладающее дополнительным функционалом и усовершенствованным подходом к безопасности. <strong>Выбор редакции PHP Inside за архитектуру, быстроту и сообщество!</strong></li>
<li><strong><a href="http://www.phpontrax.com/" target="_blank">PHP on TRAX</a></strong>. Ещё одна версия RoR на PHP.</li>
<li><strong><a href="http://www.phpopenbiz.org/jim/" target="_blank">PHPOpenBiz</a></strong>. Авторы фреймворка говорят, что их целевой аудиторией являются «IT профессионалы и консультанты», а сам фреймворк предназначен для построения бизнес-приложений.</li>
<li><strong><a href="http://www.pluf.org/" target="_blank">Pluf</a></strong>. Для тех, кому нравится Django, только на PHP. На официальном сайте есть примеры тестов, утверждающие, что это один из самых быстрых РНР-фреймворков.</li>
<li><strong><a href="http://qcu.be/" target="_blank">Qcubed</a></strong>. Сфокусирован на быстром создании прототипов.</li>
<li><strong><a href="http://onphp.org/" target="_blank">onPHP</a></strong>. При всех достоинствах и возможностях фреймворка, отличается тем, что в качестве документации представлено в основном только API.</li>
<li><strong><a href="http://www.seagullproject.org/" target="_blank">Seagull</a></strong>. Фреймворк ориетирован не только на веб-приложения, но подходит и для построения консольных, а так же GUI приложений.</li>
<li><strong><a href="http://www.solarphp.com/" target="_blank">Solar</a></strong>. Фреймворк реализует множество вариантов шаблонов проектирования.</li>
<li><strong><a href="http://www.symfony-project.com/" target="_blank">Symfony</a></strong>. Позиционируется сообществом как решение уровня предприятия для использования программистами уровня выше среднего. <strong>Выбор редакции блога tigor.com.ua <img src='http://tigor.com.ua/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  за его мощность, удобство, время создания проектов, документацию и сообщество!</strong></li>
<li><strong><a href="http://www.phpwact.org/" target="_blank">WACT</a></strong>. Особенно подходит для тех приложений, в которых периодически нужно рефакторить код и использовать юнит тесты.</li>
<li><strong><a href="http://www.yiiframework.com/" target="_blank">Yii</a></strong>. Позиционируется как фреймворк для проектов с высокой нагрузкой. Специально для него подготовлены образы для использования в рамках Vmware, включающие оптимизированный набор ПО. Последняя версия образа включает: PHP 5.2.3 fastCGI, lighttpd (mod_rewrite и fastCGI), сам фреймворк Yii 1.0.6, PostgreSQL 8.2.4, phpPgAdmin 4.1.3, Linux kernel 2.6.17.7 <strong>Тоже интересный фреймворк!</strong></li>
<li><strong><a href="http://framework.zend.com/" target="_blank">Zend</a></strong>. Фреймворк от компании Zend — одно из самых больших сообществ, мощный функционал.</li>
<li><strong><a href="http://zoopframework.com/" target="_blank">ZooP</a></strong>. Лёгкий в изучении, подойдёт для начинающих разработчиков. Как, впрочем, и для профессионалов.</li>
<li><strong><a href="http://www.fusebox.org/" target="_blank">Fusebox Framework</a></strong>. </li>
</ol>
<p>Ещё несколько фреймворков:</p>
<ol start="23">
<li><strong><a href="http://limb-project.com/ru/" target="_blank">Limb</a></strong></li>
<li><strong><a href="http://www.doophp.com/" target="_blank">Doo PHP</a></strong></li>
<li><strong><a href="http://www.recessframework.org/" target="_blank">Recess</a></strong></li>
<li><strong><a href="http://obullo.com/" target="_blank">Obullo PHP framework</a></strong>, почитать на русском &#8211; <a href="http://allframeworks.ru/blog/obullo/125.html" target="_blank">Obullo framework &#8211; еще один PHP-фреймворк.</a></li>
</ol>
<p>Другие подборки списков фреймворков на PHP:<br />
&bull; <a href="http://www.phpwact.org/php/mvc_frameworks">PHP MVC Frameworks</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2009/06/10/php-frameworks/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Zend Framework Debug Toolbar</title>
		<link>http://tigor.com.ua/blog/2009/04/01/zend-framework-debug-toolbar/</link>
		<comments>http://tigor.com.ua/blog/2009/04/01/zend-framework-debug-toolbar/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 08:09:06 +0000</pubDate>
		<dc:creator>ingvar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Отладка]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=1098</guid>
		<description><![CDATA[ 
Отладочная панель для Zend Framework, скачать Scienta ZF Debug Bar,
ознакомиться.
Аналогичные панели для других php framework:
&#8226; New in symfony 1.2: Customize the Web Debug Toolbar
&#8226; CodeIgniter Debug Toolbar
&#8226; Kohana Debug Toolbar
&#8226; PHP_Debug Toolbar &#8211; прародитель всех панелей
]]></description>
			<content:encoded><![CDATA[<p><br/> <img src="http://tigor.com.ua/blog/wp-content/uploads/2009/04/2009-scienta_debugbar.png" alt="2009-scienta_debugbar" title="2009-scienta_debugbar" width="569" height="21" class="aligncenter size-full wp-image-1099" /></p>
<p>Отладочная панель для Zend Framework, скачать <a href="http://jokke.dk/software/scientadebugbar">Scienta ZF Debug Bar</a>,<br />
<a href="http://jokke.dk/blog/2009/01/introducing_the_scienta_zf_debug_bar">ознакомиться</a>.</p>
<p>Аналогичные панели для других php framework:<br />
&bull; <a href="http://www.symfony-project.org/blog/2008/08/27/new-in-symfony-1-2-customize-the-web-debug-toolbar">New in symfony 1.2: Customize the Web Debug Toolbar</a><br />
&bull; <a href="http://habrahabr.ru/blogs/codeigniter/55477/">CodeIgniter Debug Toolbar</a><br />
&bull; <a href="http://projects.kohanaphp.com/projects/show/kohana-debug-toolbar">Kohana Debug Toolbar</a><br />
&bull; <a href="http://www.php-debug.com/www/">PHP_Debug Toolbar</a> &#8211; прародитель всех панелей</p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2009/04/01/zend-framework-debug-toolbar/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Отличная подборка инструментов, материалов по PHP, CSS</title>
		<link>http://tigor.com.ua/blog/2009/01/31/php-css-tutorials-and-tools/</link>
		<comments>http://tigor.com.ua/blog/2009/01/31/php-css-tutorials-and-tools/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 20:13:49 +0000</pubDate>
		<dc:creator>ingvar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[CSS]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=792</guid>
		<description><![CDATA[Очень полезная подборка инструментов, материалов:
&#8226; 50 Extremely Useful PHP Tools
&#8226; PHP Tutorials Utopia: 13 Vital PHP skills for every novice PHP developer and solutions
&#8226; 50 Extremely Useful And Powerful CSS Tools
&#8226; 15 Helpful In-Browser Web Development Tools
&#8226; 50 Useful Design Tools For Beautiful Web Typography
Smashing Magazine:
&#8226; Web Form Design: Modern Solutions and Creative Ideas
&#8226; Web [...]]]></description>
			<content:encoded><![CDATA[<p>Очень полезная подборка инструментов, материалов:<br />
&bull; <a href="http://www.smashingmagazine.com/2009/01/20/50-extremely-useful-php-tools/">50 Extremely Useful PHP Tools</a><br />
&bull; <a href="http://acomment.net/php-tutorials-utopia-13-vital-php-skills-for-every-novice-php-developer-and-solutions/378">PHP Tutorials Utopia: 13 Vital PHP skills for every novice PHP developer and solutions</a><br />
&bull; <a href="http://www.smashingmagazine.com/2008/12/09/50-really-useful-css-tools/">50 Extremely Useful And Powerful CSS Tools</a><br />
&bull; <a href="http://www.smashingmagazine.com/2008/11/18/15-helpful-in-browser-web-development-tools/">15 Helpful In-Browser Web Development Tools</a><br />
&bull; <a href="http://www.smashingmagazine.com/2009/01/27/css-typographic-tools-and-techniques/">50 Useful Design Tools For Beautiful Web Typography</a></p>
<p><strong>Smashing Magazine:</strong><br />
&bull; <a href="http://www.smashingmagazine.com/2008/04/17/web-form-design-modern-solutions-and-creative-ideas/">Web Form Design: Modern Solutions and Creative Ideas</a><br />
&bull; <a href="http://www.smashingmagazine.com/2008/07/04/web-form-design-patterns-sign-up-forms/">Web Form Design Patterns: Sign-Up Forms</a><br />
&bull; <a href="http://www.smashingmagazine.com/2008/07/08/web-form-design-patterns-sign-up-forms-part-2/">Web Form Design Patterns: Sign-Up Forms, Part 2</a><br />
&bull; <a href="http://www.smashingmagazine.com/2006/09/03/webdesign-trends-badges-tag-clouds-enormous-fonts/">Design Patterns: Badges, Tag Clouds, Huge Fonts</a><br />
&bull; <a href="http://www.smashingmagazine.com/2009/02/08/50-extremely-useful-javascript-tools/">50 Useful JavaScript Tools</a><br />
&bull; <a href="http://www.smashingmagazine.com/2009/02/04/50-beautiful-and-user-friendly-navigation-menus/">50 Beautiful And User-Friendly Navigation Menus</a><br />
&bull; <a href="http://www.smashingmagazine.com/2009/02/26/10-steps-to-the-perfect-portfolio-website/">10 Steps To The Perfect Portfolio Website</a><br />
&bull; <a href="http://www.smashingmagazine.com/2009/02/16/50-beautiful-useful-and-free-icon-sets/">50 Free High-Quality Icon Sets</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2009/01/31/php-css-tutorials-and-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DOMDocument::loadXML &#8211; кодировка UTF-8 для XML</title>
		<link>http://tigor.com.ua/blog/2008/08/06/domdocument-loadxml-encoding-utf8-in-xml/</link>
		<comments>http://tigor.com.ua/blog/2008/08/06/domdocument-loadxml-encoding-utf8-in-xml/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 16:49:06 +0000</pubDate>
		<dc:creator>Igor</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=329</guid>
		<description><![CDATA[Сегодня столкнулся с одним неприятным багом PHP при работе с XML с кодировкой UTF-8. Если воспользоваться функцией DOMDocument::loadXML.

Есть исходный xml-файл: 1.xml

&#60;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&#62;
&#60;root&#62;
   &#60;name&#62;Имя&#60;/name&#62;
   &#60;description&#62;Description&#60;/description&#62;
&#60;/root&#62;

Теперь хотим воспользоваться DOMDocument и подгрузить файл, далее дампим его содержимое на  экран. В этом примере все будет работать на ура и результат будет идентичен файлу [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня столкнулся с одним неприятным багом PHP при работе с XML с кодировкой UTF-8. Если воспользоваться функцией DOMDocument::loadXML.</p>
<p><span id="more-329"></span></p>
<p>Есть исходный xml-файл: 1.xml</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;root&gt;
   &lt;name&gt;Имя&lt;/name&gt;
   &lt;description&gt;Description&lt;/description&gt;
&lt;/root&gt;
</pre>
<p>Теперь хотим воспользоваться DOMDocument и подгрузить файл, далее дампим его содержимое на  экран. В этом примере все будет работать на ура и результат будет идентичен файлу 1.xml &#8211; байт к байту <img src='http://tigor.com.ua/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<pre class="brush: php;">
$dom = new DOMDocument('1.0', 'UTF-8');
$dom-&gt;load('1.xml');
echo $dom-&gt;saveXML();
</pre>
<p>Рассмотрим другую ситуацию, когда мы xml-данные как-то получаем, меняем,  добавляем и в итоге передаем строку в функцию loadXML.</p>
<pre class="brush: php;">
$xml = &lt;&lt;&lt;XML
&lt;root&gt;
   &lt;name&gt;Имя&lt;/name&gt;
   &lt;description&gt;Description&lt;/description&gt;
&lt;/root&gt;
XML;

$dom = new DOMDocument('1.0', 'UTF-8');
$dom-&gt;loadXML($xml);
echo $dom-&gt;saveXML();
</pre>
<p> А на выходе получаем нижеследующее. Куда делись наши символы на русском? И исчезла кодировка UTF-8?</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;root&gt;
   &lt;name&gt;&amp;#x418;&amp;#x43C;&amp;#x44F;&lt;/name&gt;
   &lt;description&gt;Description&lt;/description&gt;
&lt;/root&gt;
</pre>
<p>После нескольких часов экспериментов выяснил, что никак её установить нельзя, но лекарство есть, и оно следующее: нужно добавить заголовок xml-файла с кодировкой. И вуаля &#8211; красота <img src='http://tigor.com.ua/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , все стало работать. Надеюсь в версии PHP 6 они сделают поддержку UTF-8 получше.</p>
<pre class="brush: php;">
$xml = &lt;&lt;&lt;XML
&lt;root&gt;
   &lt;name&gt;Имя&lt;/name&gt;
   &lt;description&gt;Description&lt;/description&gt;
&lt;/root&gt;
XML;

$dom = new DOMDocument('1.0', 'UTF-8');
$dom-&gt;loadXML('&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;' . &quot;\n&quot; . $xml);
echo $dom-&gt;saveXML();
</pre>
<p><strong>Ссылки по теме:</strong><br />
&bull; <a href="http://php.net/manual/en/domcomment.construct.php">DOMDocument::__construct</a><br />
&bull; <a href="http://ua2.php.net/manual/en/domdocument.loadxml.php">DOMDocument::loadXML</a><br />
&bull; <a href="http://blog.fxposter.org/2008/07/20/domdocument-encoding-in-html/">DomDocument &#8211; кодировка в HTML-документах</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2008/08/06/domdocument-loadxml-encoding-utf8-in-xml/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Методы сортировки на php от Gustav Eklundh</title>
		<link>http://tigor.com.ua/blog/2008/08/01/sort-implemented-in-php-by-gustav-eklundh/</link>
		<comments>http://tigor.com.ua/blog/2008/08/01/sort-implemented-in-php-by-gustav-eklundh/#comments</comments>
		<pubDate>Fri, 01 Aug 2008 21:54:12 +0000</pubDate>
		<dc:creator>Igor</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=293</guid>
		<description><![CDATA[Gustav Eklundh разместил на своем блоге серию статей о методах сортировки.
Он кратко объясняет каждый из методов сортировки. Плюс указывает ссылки на материалы, где можно подробнее почитать про сортировку.
&#8226; Quicksort
&#8226; Gnome sort
&#8226; Strand sort
&#8226; Merge sort 
]]></description>
			<content:encoded><![CDATA[<p>Gustav Eklundh разместил на своем <a href="http://threebyte.eu/" title="Threebyte blog">блоге</a> серию статей о методах сортировки.</p>
<p>Он кратко объясняет каждый из методов сортировки. Плюс указывает ссылки на материалы, где можно подробнее почитать про сортировку.</p>
<p>&bull; <a href="http://threebyte.eu/2008/07/29/quicksort-implemented-in-php/">Quicksort</a><br />
&bull; <a href="http://threebyte.eu/2008/07/29/gnome-sort-implemented-in-php/">Gnome sort</a><br />
&bull; <a href="http://threebyte.eu/2008/07/30/strand-sort-presented-in-php/">Strand sort</a><br />
&bull; <a href="http://threebyte.eu/2008/07/31/mergesort-implemented-in-php/">Merge sort </a></p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2008/08/01/sort-implemented-in-php-by-gustav-eklundh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
