<?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>Paradigm.ru &#187; php</title>
	<atom:link href="http://paradigm.ru/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://paradigm.ru</link>
	<description>Блог Александра Мусаева</description>
	<lastBuildDate>Sat, 08 May 2010 16:13:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Открыта регистрация на первую в России конференцию по Zend Framework</title>
		<link>http://paradigm.ru/2010/02/zend-conf-spb</link>
		<comments>http://paradigm.ru/2010/02/zend-conf-spb#comments</comments>
		<pubDate>Mon, 01 Feb 2010 09:41:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[веб-разработка]]></category>
		<category><![CDATA[конференции]]></category>

		<guid isPermaLink="false">http://paradigm.ru/?p=441</guid>
		<description><![CDATA[В конце марта 2010 г. в Санкт-Петербурге пройдет первая в России конференция по Zend Framework. На днях закончился прием тезисов по планируемым докладам. Примечательно, что в состав докладчиков вошли ведущие участники русскоязычного сообщества ZF, опытнейшие специалисты и лично один из создателей фрэймворка. Участие в конференции планируется сделать бесплатным или за небольшую стоимость. На данный момент [...]]]></description>
			<content:encoded><![CDATA[<p>В конце марта 2010 г. в Санкт-Петербурге пройдет первая в России конференция по Zend Framework.</p>
<p>На днях закончился прием тезисов по планируемым докладам. Примечательно, что в состав докладчиков вошли ведущие участники русскоязычного сообщества ZF, опытнейшие специалисты и лично один из создателей фрэймворка.</p>
<div align="center"><img src="http://paradigm.ru/;-)/2010/02/ZendFramework-logo.png" alt="" title="ZendFramework-logo" width="500" height="132" /></div>
<p>Участие в конференции планируется сделать бесплатным или за небольшую стоимость. На данный момент уже открыта <a href="http://www.zfconf.ru/pre-registration.php">предварительная регистрация</a>. Для решения ряда вопросов организаторам очень важно сейчас понять приблизительное количество человек, которые смогут посетить конференцию или каким-то иным образом принять в ней участие.</p>
<p>Каждый предстоящий доклад возможно обсудить на форуме ZF-сообщества. Ваше мнение очень важно для авторов.</p>
<p>Планируемые доклады:</p>
<ul>
<li><a href="http://zendframework.ru/forum/index.php?topic=2269.0">Жизненный цикл предложений (proposals) в проекте Zend Framework</a><br />
Александр Веремьев (Zend Technologies, Zend Framework Core команда)</li>
<li><a href="http://zendframework.ru/forum/index.php?topic=2270.0">Zend_Search_Lucene в деталях</a><br />
Александр Веремьев (Zend Technologies, Zend Framework Core команда)</li>
<li><a href="http://zendframework.ru/forum/index.php?topic=2271.0">Zend Framework и производительность</a><br />
Александр Махомет (создатель сообщества ZendFramework.ru)</li>
<li><a href="http://zendframework.ru/forum/index.php?topic=2272.0">Zend Framework и MVC, «толстая» модель</a><br />
Александр Стешенко (Norada Corporation, PHP-разработчик)</li>
<li><a href="http://zendframework.ru/forum/index.php?topic=2273.0">ФотоСтрана.ru: Прототипирование с использованием ZF</a> (история боевого применения Zend Framework в highload-проекте)<br />
Леонид Жаворонков (ФотоСтрана.ru, тимлид)</li>
<li><a href="http://zendframework.ru/forum/index.php?topic=2274.0">Использование очередей сообщений в повседневных проектах</a><br />
Денис Баклыков (Обновление, веб-разработчик)</li>
<li><a href="http://zendframework.ru/forum/index.php?topic=2275.0">Zend Framework и Doctrine</a><br />
Степан Танасийчук (руководитель веб-студии stfalcon.com)</li>
<li><a href="http://zendframework.ru/forum/index.php?topic=2276.0">Zend Framework и мультиязычность</a><br />
Степан Танасийчук (руководитель веб-студии stfalcon.com)</li>
<li><a href="http://zendframework.ru/forum/index.php?topic=2277.0">История проекта e-Штаб</a><br />
Анатолий Ларин (e-Легион, веб-программист)</li>
<li><a href="http://zendframework.ru/forum/index.php?topic=2278.0">Что нового несет нам Zend Framework 2.0?</a><br />
Надежда Блинова (Wizartech, веб-программист), Георгий Туревич (Wizartech, ведущий веб-программист)</li>
<li><a href="http://zendframework.ru/forum/index.php?topic=2279.0">Интеграция Zend Framework c Javascript-фрэймворками jQuery и Dojo Toolkit</a><br />
Георгий Туревич (Wizartech, ведущий веб-программист)</li>
</ul>
<p>Смело обсуждайте доклады и <a href="http://www.zfconf.ru/pre-registration.php">регистрируйтесь</a>!</p>
<p>За последними новостями можно следить здесь:</p>
<ul>
<li>RSS-канал: <a href="http://feeds.feedburner.com/zfconf">http://feeds.feedburner.com/zfconf</a></li>
<li>Twitter: @<a href="http://twitter.com/zfconf">zfconf</a></li>
<li>Группа Вконтакте: <a href="http://vkontakte.ru/club14951507">http://vkontakte.ru/club14951507</a></li>
</ul>
<p>К участию приглашаются информационные и финансовые спонсоры.</p>
]]></content:encoded>
			<wfw:commentRss>http://paradigm.ru/2010/02/zend-conf-spb/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Инфраструктура Zend Framework 1.5</title>
		<link>http://paradigm.ru/2008/04/zend-framework-infrastructure</link>
		<comments>http://paradigm.ru/2008/04/zend-framework-infrastructure#comments</comments>
		<pubDate>Mon, 21 Apr 2008 17:00:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[cheatsheets]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://paradigm.ru/?p=279</guid>
		<description><![CDATA[В&#160;последнее время я&#160;все меньше слежу за&#160;развитием Zend Framework. Под текущие задачи подходит более легковесный CodeIgniter, а в ближайшей перспективе есть планы перелезть на Python и Django. Тем не&#160;менее ZF&#160;остаётся одним из&#160;основных крупнокалиберных MVC-фреймворков для разработки CMS и&#160;веб-приложений на PHP (перечитал предложение, мысленно охнул от количества аббревиатур, но все равно решил не расшифровывать &#8212; c&#8217;est la [...]]]></description>
			<content:encoded><![CDATA[<p>В&nbsp;последнее время я&nbsp;все меньше слежу за&nbsp;развитием Zend Framework. Под текущие задачи подходит более легковесный CodeIgniter, а в ближайшей перспективе есть планы перелезть на Python и Django.</p>
<p>Тем не&nbsp;менее ZF&nbsp;остаётся одним из&nbsp;основных крупнокалиберных MVC-фреймворков для разработки CMS и&nbsp;веб-приложений на PHP (перечитал предложение, мысленно охнул от количества аббревиатур, но все равно решил не расшифровывать &#8212; c&#8217;est la vie, что уж тут). Общее представление о&nbsp;внутреннем устройстве и&nbsp;ключевых компонентах последней версии ZF&nbsp;дает весьма наглядная схема, найденная сегодня на&nbsp;блоге <a href="http://b23.ru/k9p" ref="nofollow">cоde:diesel</a>:</p>
<div align="center"><a href='http://www.codediesel.com/data/pdf/zend_framework.pdf'><img src="http://paradigm.ru/;-)/2008/04/zf-15.png" alt="Инфраструктура Zend Framework 1.5" title="zf-15" width="500" height="565" class="alignnone size-medium wp-image-280" /></a></div>
<p>Схема доступна в&nbsp;формате PDF, в&nbsp;виде <a href="http://www.codediesel.com/data/pdf/zend_framework.pdf">цветного</a> и&nbsp;<a href="http://www.codediesel.com/data/pdf/zend_framework_blackwhite.pdf">черно-белого</a> варианта (последний, на&nbsp;мой взгляд, предпочтительнее для печати, т.к. сделан на&nbsp;белом фоне).</p>
]]></content:encoded>
			<wfw:commentRss>http://paradigm.ru/2008/04/zend-framework-infrastructure/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Поговорим о погоде</title>
		<link>http://paradigm.ru/2008/02/yahoo-weather</link>
		<comments>http://paradigm.ru/2008/02/yahoo-weather#comments</comments>
		<pubDate>Mon, 18 Feb 2008 14:19:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[yahoo]]></category>
		<category><![CDATA[прогноз погоды]]></category>
		<category><![CDATA[сервисы]]></category>

		<guid isPermaLink="false">http://www.paradigm.ru/2008/02/18/yahoo-weather/</guid>
		<description><![CDATA[За&#160;последнее время мне пришлось довольно основательно пообщаться с&#160;несколькими сервисами Yahoo! В&#160;этой заметке расскажу об&#160;одном из&#160;них, который для многих может оказаться полезным. Это сервис прогноза погоды Yahoo! Weather. Года два назад я&#160;искал в&#160;сети удобный и&#160;открытый источник подобных данных, но&#160;так ничего и&#160;не&#160;нашел. Все отечественные сервисы экспортировали данные за&#160;деньги (отпугивала скорее не&#160;цена, а&#160;наличие возни с&#160;оплатой), а&#160;западные&#160;&#8212; либо не&#160;предоставляли [...]]]></description>
			<content:encoded><![CDATA[<p>За&nbsp;последнее время мне пришлось довольно основательно пообщаться с&nbsp;несколькими сервисами Yahoo! В&nbsp;этой заметке расскажу об&nbsp;одном из&nbsp;них, который для многих может оказаться полезным. Это сервис прогноза погоды <a href="http://weather.yahoo.com/">Yahoo! Weather</a>.</p>
<p>Года два назад я&nbsp;искал в&nbsp;сети удобный и&nbsp;открытый источник подобных данных, но&nbsp;так ничего и&nbsp;не&nbsp;нашел. Все отечественные сервисы экспортировали данные за&nbsp;деньги (отпугивала скорее не&nbsp;цена, а&nbsp;наличие возни с&nbsp;оплатой), а&nbsp;западные&nbsp;&#8212; либо не&nbsp;предоставляли данных в&nbsp;удобном для автоматической обработки формате, либо не&nbsp;знали о&nbsp;существовании города, в&nbsp;котором я&nbsp;живу.</p>
<p>Yahoo! Weather порадовал отсутствием перечисленных недостатков. Информация о&nbsp;текущей погоде, а&nbsp;так&nbsp;же прогноз на&nbsp;ближайшие 5&nbsp;дней экспортируется с&nbsp;их&nbsp;сервера в&nbsp;формате RSS. На&nbsp;мой взгляд, выбор этого формата притянут за&nbsp;уши, т.к. погодная RSS &laquo;лента&raquo; содержит всего однин item. Те&nbsp;же данные можно было&nbsp;бы экспортировать в&nbsp;более лаконичном виде, но&nbsp;в&nbsp;Yahoo, по&nbsp;всей видимости, расчитывали на&nbsp;стандартные методы обработки RSS, что тоже довольно весомый довод. Стандарт&nbsp;&#8212; это все-таки стандарт.</p>
<p>Адрес RSS фида для интересующего города можно найти на&nbsp;сайте <a href="http://weather.yahoo.com/">weather.yahoo.com</a>.</p>
<p><img src="http://paradigm.ru/;-)/2008/02/yahoo-weather.png" width="500" height="291" alt="" /></p>
<p>В&nbsp;общем виде URL выглядит следующим образом:</p>
<p><code>http://xml.weather.yahoo.com/forecastrss?p=<strong style="color:green;">код_города</strong>&#038;u=<strong style="color:red;">единицы_измерения</strong></code></p>
<p>Первый параметр&nbsp;&#8212; идентификатор интересующего города. Второй параметр определяет, в&nbsp;каких единицах будет выдаваться температура. Значение &laquo;c&raquo; соответствует градусам Цельсия, &laquo;f&raquo;&nbsp;&#8212; градусам Фаренгейта. <span id="more-181"></span></p>
<p>Несколько примеров:</p>
<ul>
<li>Москва&nbsp;&#8212; <a href="http://xml.weather.yahoo.com/forecastrss?p=RSXX0063&#038;u=c">http://xml.weather.yahoo.com/forecastrss?p=RSXX0063&amp;u=c</a></li>
<li>Санкт-Петербург&nbsp;&#8212; <a href="http://xml.weather.yahoo.com/forecastrss?p=RSXX0091&#038;u=c">http://xml.weather.yahoo.com/forecastrss?p=RSXX0091&amp;u=c</a></li>
<li>Екатеринбург&nbsp;&#8212; <a href="http://xml.weather.yahoo.com/forecastrss?p=RSXX1219&#038;u=c">http://xml.weather.yahoo.com/forecastrss?p=RSXX1219&amp;u=c</a></li>
<li>Ханты-Мансийск&nbsp;&#8212; <a href="http://xml.weather.yahoo.com/forecastrss?p=RSXX1234&#038;u=c">http://xml.weather.yahoo.com/forecastrss?p=RSXX1234&amp;u=c</a></li>
<li>Киев&nbsp;&#8212; <a href="http://xml.weather.yahoo.com/forecastrss?p=UPXX0016&#038;u=c">http://xml.weather.yahoo.com/forecastrss?p=UPXX0016&amp;u=c</a></li>
</ul>
<p>Описанный ниже класс <code>YahooWeather</code> (PHP5) предназначен для загрузки RSS по&nbsp;HTTP и&nbsp;предварительной обработки данных.</p>
<pre><code class="php">&lt;?php

class YahooWeather {
	// Ветер
	public $wind_chill;
	public $wind_direction;
	public $wind_speed;

	// Атмосферные показатели
	public $humidity;
	public $visibility;
	public $pressure;

	// Время восхода и заката переводим в формат unix time
	public $sunrise;
	public $sunset;

	// Текущая температура воздуха и погода
	public $temp;
	public $condition_text;
	public $condition_code;

	// Прогноз погоды на 5 дней
	public $forecast;

	public $units;

	function __construct($code, $units = 'c', $lang = 'en') {
		$this-&gt;units = ($units == 'c')?'c':'f';

		$url = 'http://xml.weather.yahoo.com/forecastrss?p='.
			$code.'&#038;u='.$this-&gt;units;

		$xml_contents = file_get_contents($url);
		if($xml_contents === false)
			throw new Exception('Error loading '.$url);

		$xml = new SimpleXMLElement($xml_contents);

		// Ветер
		$tmp = $xml-&gt;xpath('/rss/channel/yweather:wind');
		if($tmp === false) throw new Exception("Error parsing XML.");
		$tmp = $tmp[0];

		$this-&gt;wind_chill = (int)$tmp['chill'];
		$this-&gt;wind_direction = (int)$tmp['direction'];
		$this-&gt;wind_speed = (int)$tmp['speed'];

		// Атмосферные показатели
		$tmp = $xml-&gt;xpath('/rss/channel/yweather:atmosphere');
		if($tmp === false) throw new Exception("Error parsing XML.");
		$tmp = $tmp[0];

		$this-&gt;humidity = (int)$tmp['humidity'];
		$this-&gt;visibility = (int)$tmp['visibility'];
		$this-&gt;pressure = (int)$tmp['pressure'];

		// Время восхода и заката переводим в формат unix time
		$tmp = $xml-&gt;xpath('/rss/channel/yweather:astronomy');
		if($tmp === false) throw new Exception("Error parsing XML.");
		$tmp = $tmp[0];

		$this-&gt;sunrise = strtotime($tmp['sunrise']);
		$this-&gt;sunset = strtotime($tmp['sunset']);

		// Текущая температура воздуха и погода
		$tmp = $xml-&gt;xpath('/rss/channel/item/yweather:condition');
		if($tmp === false) throw new Exception("Error parsing XML.");
		$tmp = $tmp[0];

		$this-&gt;temp = (int)$tmp['temp'];
		$this-&gt;condition_text = strtolower((string)$tmp['text']);
		$this-&gt;condition_code = (int)$tmp['code'];

		// Прогноз погоды на 5 дней
		$forecast = array();
		$tmp = $xml-&gt;xpath('/rss/channel/item/yweather:forecast');
		if($tmp === false) throw new Exception("Error parsing XML.");

		foreach($tmp as $day) {
			$this-&gt;forecast[] = array(
				'date' =&gt; strtotime((string)$day['date']),
				'low' =&gt; (int)$day['low'],
				'high' =&gt; (int)$day['high'],
				'text' =&gt; (string)$day['text'],
				'code' =&gt; (int)$day['code']
			);
		}
	}

	public function __toString() {
		$u = "&deg;".(($this-&gt;units == 'c')?'C':'F');
		return $this-&gt;temp.' '.$u.', '.$this-&gt;condition_text;
	}
}

?&gt;</code></pre>
<p>Пример использования:</p>
<pre><code class="php">&lt;?php

try {
	$weather = new YahooWeather('RSXX0091');
} catch(Exception $e) {
	echo "Caught exception: ".$e-&gt;getMessage();
	exit();
}

echo '&lt;h1&gt;'.$weather.'&lt;/h1&gt;';

echo "&lt;pre&gt;";
print_r($weather);
echo "&lt;/pre&gt;";

?&gt;</code></pre>
<p>Вывод:</p>
<p><img src="http://paradigm.ru/;-)/2008/02/weather-report.png" width="447" height="441" alt="" /></p>
<p>Временн<strong>ы</strong>е значения восхода и&nbsp;заката солнца (поля <code>sunrise</code> и&nbsp;<code>sunset</code> соответственно) автоматически переводятся в&nbsp;формат unix time. стоит так&nbsp;же обратить внимание на&nbsp;то,&nbsp;что по&nbsp;непонятной причине Yahoo! выдает явно некорректное значение атмосферного давления (0). Но&nbsp;само наличие соответствующего атрибута в&nbsp;XML дает некоторую надежду на&nbsp;то,&nbsp;что рано или поздно экспорт этих данных починят.</p>
<p>Поле <code>condition_code</code> используется для хранения кодового обозначения погодных условий. Текстовая расшифровка текущего значения хранится в&nbsp;поле <code>condition_text</code>, а&nbsp;полный перечень возможных вариантов приведен в&nbsp;следующей таблице:</p>
<table style="width:80%;">
<tr>
<th style="width: 10%;">Код</th>
<th>Описание</th>
</tr>
<tr>
<td>0</td>
<td>tornado</td>
</tr>
<tr>
<td>1</td>
<td>tropical storm</td>
</tr>
<tr>
<td>2</td>
<td>hurricane</td>
</tr>
<tr>
<td>3</td>
<td>severe thunderstorms</td>
</tr>
<tr>
<td>4</td>
<td>thunderstorms</td>
</tr>
<tr>
<td>5</td>
<td>mixed rain and snow</td>
</tr>
<tr>
<td>6</td>
<td>mixed rain and sleet</td>
</tr>
<tr>
<td>7</td>
<td>mixed snow and sleet</td>
</tr>
<tr>
<td>8</td>
<td>freezing drizzle</td>
</tr>
<tr>
<td>9</td>
<td>drizzle</td>
</tr>
<tr>
<td>10</td>
<td>freezing rain</td>
</tr>
<tr>
<td>11</td>
<td>showers</td>
</tr>
<tr>
<td>12</td>
<td>showers</td>
</tr>
<tr>
<td>13</td>
<td>snow flurries</td>
</tr>
<tr>
<td>14</td>
<td>light snow showers</td>
</tr>
<tr>
<td>15</td>
<td>blowing snow</td>
</tr>
<tr>
<td>16</td>
<td>snow</td>
</tr>
<tr>
<td>17</td>
<td>hail</td>
</tr>
<tr>
<td>18</td>
<td>sleet</td>
</tr>
<tr>
<td>19</td>
<td>dust</td>
</tr>
<tr>
<td>20</td>
<td>foggy</td>
</tr>
<tr>
<td>21</td>
<td>haze</td>
</tr>
<tr>
<td>22</td>
<td>smoky</td>
</tr>
<tr>
<td>23</td>
<td>blustery</td>
</tr>
<tr>
<td>24</td>
<td>windy</td>
</tr>
<tr>
<td>25</td>
<td>cold</td>
</tr>
<tr>
<td>26</td>
<td>cloudy</td>
</tr>
<tr>
<td>27</td>
<td>mostly cloudy (night)</td>
</tr>
<tr>
<td>28</td>
<td>mostly cloudy (day)</td>
</tr>
<tr>
<td>29</td>
<td>partly cloudy (night)</td>
</tr>
<tr>
<td>30</td>
<td>partly cloudy (day)</td>
</tr>
<tr>
<td>31</td>
<td>clear (night)</td>
</tr>
<tr>
<td>32</td>
<td>sunny</td>
</tr>
<tr>
<td>33</td>
<td>fair (night)</td>
</tr>
<tr>
<td>34</td>
<td>fair (day)</td>
</tr>
<tr>
<td>35</td>
<td>mixed rain and hail</td>
</tr>
<tr>
<td>36</td>
<td>hot</td>
</tr>
<tr>
<td>37</td>
<td>isolated thunderstorms</td>
</tr>
<tr>
<td>38</td>
<td>scattered thunderstorms</td>
</tr>
<tr>
<td>39</td>
<td>scattered thunderstorms</td>
</tr>
<tr>
<td>40</td>
<td>scattered showers</td>
</tr>
<tr>
<td>41</td>
<td>heavy snow</td>
</tr>
<tr>
<td>42</td>
<td>scattered snow showers</td>
</tr>
<tr>
<td>43</td>
<td>heavy snow</td>
</tr>
<tr>
<td>44</td>
<td>partly cloudy</td>
</tr>
<tr>
<td>45</td>
<td>thundershowers</td>
</tr>
<tr>
<td>46</td>
<td>snow showers</td>
</tr>
<tr>
<td>47</td>
<td>isolated thundershowers</td>
</tr>
<tr>
<td>3200</td>
<td>not available</td>
</tr>
</table>
<h3>Ссылки по&nbsp;теме</h3>
<ul>
<li><a href="http://weather.yahoo.com/">Yahoo! Weather</a></li>
<li><a href="http://developer.yahoo.com/weather/">Yahoo! Weather RSS feed</a> @ Yahoo! Dev Network&nbsp;&#8212; полное описание экспортируемых данных</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://paradigm.ru/2008/02/yahoo-weather/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Blitz Templates</title>
		<link>http://paradigm.ru/2008/01/blitz-templates</link>
		<comments>http://paradigm.ru/2008/01/blitz-templates#comments</comments>
		<pubDate>Mon, 14 Jan 2008 13:49:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[blitz templates]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[веб-разработка]]></category>
		<category><![CDATA[шаблонизаторы]]></category>

		<guid isPermaLink="false">http://www.paradigm.ru/2008/01/14/blitz-templates/</guid>
		<description><![CDATA[Сегодняшний информационный повод&#160;&#8212; открытие шаблонизатора Blitz Templates, который ранее ускользал от&#160;моего внимания. Из&#160;всех парсеров темплейтов, с&#160;которыми я&#160;имел дело, это первый, реализованный в&#160;виде модуля интерпретатора PHP. Как не&#160;сложно догадаться, это радикально-положительным образом сказывается на&#160;производительности системы, но&#160;вначале я&#160;бы хотел высказаться о&#160;другом его свойстве. Как известно, задачей любого парсера темплейтов является полумифическое отделение кода (и&#160;данных) от&#160;оформления страниц. Я&#160;говорю [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодняшний информационный повод&nbsp;&#8212; открытие шаблонизатора <a href="http://alexeyrybak.com/blitz/blitz_ru.html">Blitz Templates</a>, который ранее ускользал от&nbsp;моего внимания. Из&nbsp;всех парсеров темплейтов, с&nbsp;которыми я&nbsp;имел дело, это первый, реализованный в&nbsp;виде модуля интерпретатора PHP. Как не&nbsp;сложно догадаться, это радикально-положительным образом сказывается на&nbsp;производительности системы, но&nbsp;вначале я&nbsp;бы хотел высказаться о&nbsp;другом его свойстве.</p>
<p>Как известно, задачей любого парсера темплейтов является полумифическое отделение кода (и&nbsp;данных) от&nbsp;оформления страниц. Я&nbsp;говорю полумифического, т.к. в&nbsp;действительности ни&nbsp;один развитый шаблонизатор не&nbsp;может похвастаться реализованной в&nbsp;полной мере такой возможностью. Когда требования к&nbsp;функциональности шаблонов возрастают, их&nbsp;синтаксис усложняется, постепенно перерастая в&nbsp;специализированный язык. Показательный пример тому&nbsp;&#8212; Smarty и&nbsp;многие другие распространенные движки темплейтов. Строго говоря, сам PHP можно отнести к&nbsp;категории очень навороченного генератора страниц.</p>
<p>В&nbsp;итоге, одним из&nbsp;основных критериев при выборе шаблонизатора становится не&nbsp;качество (или степень) отделения кода от&nbsp;оформления, а&nbsp;скорее читаемость этого кода&nbsp;&#8212; достаточно субъективная характеристика, которая сильно зависит не&nbsp;только от&nbsp;шаблонизатора, но&nbsp;и&nbsp;от&nbsp;стиля кодинга. Показательный пример: XSLT является одним из&nbsp;наиболее идеологически-грамотных шаблонизаторов, тем не&nbsp;менее он&nbsp;сейчас пользуется <a href="http://b23.ru/czi">не&nbsp;самой большой популярностью</a>. Одна из&nbsp;причин тому&nbsp;&#8212; очень навороченный синтаксис. <span id="more-156"></span></p>
<p>В&nbsp;контексте сказанного выше, мне понравилась идеология, заложенная в&nbsp;синтаксис Blitz. цитата из&nbsp;официального источника:</p>
<blockquote><p>Blitz не&nbsp;поддерживает по&nbsp;принципиальным соображениям сложные выражения:</p>
<p><code>{{if(if($foo, 0,&nbsp;1), &#8217;bar&#8217;, &#8217;foobar&#8217;)}}</code></p>
<p>Данный код работать не&nbsp;будет. Не&nbsp;надо превращать код в&nbsp;спагетти.</p></blockquote>
<p>И&nbsp;это очень правильный подход. Гибкие возможности строить сложные синтаксические конструкции&nbsp;&#8212; не&nbsp;всегда хорошо. Часто это служит причиной возникновения настолько запутанного кода, что в&nbsp;него не&nbsp;то&nbsp;что сторонний разработкич побоится залезть, но&nbsp;и&nbsp;сам автор, через пару месяцев после написания, предпочтет полную переработку корректировке деталей.</p>
<p>Упрощение синтаксиса хорошо еще и&nbsp;потому, что у&nbsp;кода шаблонов есть своя специфика: зачастую в&nbsp;темплейтах осознанно не&nbsp;делают форматирования (чтобы не&nbsp;портить форматирование генерируемого HTML и/или не&nbsp;утяжелять его излишним количеством пробельных символов), кроме того в&nbsp;текстовых редакторах обычно нет синтаксической подсветки кода темплейтов, которая облегчила&nbsp;бы работу (исключения&nbsp;&#8212; XSLT и,&nbsp;опять&nbsp;же, PHP).</p>
<p>Возвращаясь к&nbsp;вопросу производительности: Blitz работает быстрее, чем шаблоны, собираемые из&nbsp;отдельных PHP файлов (include-ами), но,&nbsp;по&nbsp;понятным причинам, медленее сплошного PHP кода. Учитывая, что нежелание использовать темплейтов на&nbsp;базе PHP&nbsp;&#8212; одна из&nbsp;самых важных причин использования сторонних шаблонизаторов вообще, можно считать, что Blitz фактически является лидером по&nbsp;скорости среди других систем своего класса.</p>
<p><img src="http://paradigm.ru/;-)/2008/01/lebowski-bench-small.gif" width="522" height="362" alt="" /></p>
<p>Отдельно стоит упомянуть процесс тестирования, точнее обстоятельный подход, с&nbsp;котором он&nbsp;выполнен и&nbsp;описан на&nbsp;сайте разработчика. Неоднократно видел, как производительность шаблонизаторов, фреймворков и&nbsp;CMS измеряют на&nbsp;примерах уровня сложности &laquo;Hello world&raquo;, а&nbsp;потом кричат &laquo;Сенсация! PHP работает быстрее кода на&nbsp;C++!&raquo;. Что касается Blitz&nbsp;&#8212; тесты проводились в&nbsp;условиях, близких к&nbsp;боевым, и&nbsp;полностью обоснованы.</p>
<p>Вывод: на&nbsp;Blitz стоит обратить пристальное внимание при проектировании высокопроизводительных CMS для сайтов, работающих на&nbsp;выделенных серверах. В&nbsp;тех случаях, когда серьезных требований к&nbsp;производительности нет, его использование, к&nbsp;сожалению, будет не&nbsp;всегда оправдано экономически (пользовательские модули PHP&nbsp;&#8212; вещь не&nbsp;для shared хостинга).</p>
<h3>Ссылки по&nbsp;теме</h3>
<ul>
<li><a href="http://alexeyrybak.com/blitz/blitz_ru.html">Blitz Templates</a>&nbsp;&#8212; официальная страница разработки с&nbsp;описанием синтаксиса и&nbsp;результатами сравнительных тестов.</li>
<li>Другие шаблонизаторы: <a href="http://www.smarty.net/">Smarty</a>, <a href="http://templatelite.sourceforge.net/">Template Lite</a> (облегченная и&nbsp;более быстрая версия Smarty), <a href="http://b23.ru/czu">PEAR::HTML_Template_*</a> (средства PEAR для генерации страниц по&nbsp;шаблонам).</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://paradigm.ru/2008/01/blitz-templates/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Обработка сообщений об ошибках PHP</title>
		<link>http://paradigm.ru/2008/01/php-errors-log</link>
		<comments>http://paradigm.ru/2008/01/php-errors-log#comments</comments>
		<pubDate>Wed, 09 Jan 2008 13:09:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[веб-разработка]]></category>
		<category><![CDATA[логи]]></category>
		<category><![CDATA[обработка ошибок]]></category>

		<guid isPermaLink="false">http://www.paradigm.ru/2008/01/09/php-errors-log/</guid>
		<description><![CDATA[В&#160;заметке &#171;Работа над ошибками&#187; я&#160;уже упоминал о&#160;том, насколько неуместно на&#160;страницах сайта могут выглядеть сообщения об&#160;ошибках, выдаваемые интерпретатором PHP. Многие разработчики зачастую не&#160;уделяют должного внимания тому, чтобы избавить посетителей сайтов от&#160;необходимости лицезреть подобный мусор. Вероятно, самой массовой на&#160;то&#160;причиной (после лени, конечно) является вера в&#160;идеальность алгоритмов и&#160;абсолютную непотопляемость серверов БД.&#160;Тем не&#160;менее, одним из&#160;показателей грамотной реализации и&#160;внедрения системы [...]]]></description>
			<content:encoded><![CDATA[<p>В&nbsp;заметке &laquo;<a href="http://www.paradigm.ru/2007/12/17/404-and-her-friends/">Работа над ошибками</a>&raquo; я&nbsp;уже упоминал о&nbsp;том, насколько неуместно на&nbsp;страницах сайта могут выглядеть сообщения об&nbsp;ошибках, выдаваемые интерпретатором PHP. Многие разработчики зачастую не&nbsp;уделяют должного внимания тому, чтобы избавить посетителей сайтов от&nbsp;необходимости лицезреть подобный мусор. Вероятно, самой массовой на&nbsp;то&nbsp;причиной (после лени, конечно) является вера в&nbsp;идеальность алгоритмов и&nbsp;абсолютную непотопляемость серверов БД.&nbsp;Тем не&nbsp;менее, одним из&nbsp;показателей грамотной реализации и&nbsp;внедрения системы является контролируемость вывода всех служебных сообщений интерпретатора.</p>
<p>Самый простой способ для этого&nbsp;&#8212; использовать функцию <a href="http://b23.ru/c2s">error_reporting()</a> (или параметр конфигурационного файла PHP с&nbsp;аналогичным названием). С&nbsp;ее&nbsp;помощью можно, например, полностью отключить вывод ошибок в&nbsp;production версии скрипта, оставив их&nbsp;видимыми только для разработчика. Но&nbsp;это не&nbsp;самый оптимальный подход, т.к. он&nbsp;лишает возможности отслеживать исключительные ситуации в&nbsp;работе &laquo;боевой&raquo; версии.</p>
<p>Наиболее грамотное решение&nbsp;&#8212; перенаправлять все сообщения об&nbsp;ошибках в&nbsp;лог. Сделать это можно множеством способов. Один из&nbsp;них&nbsp;&#8212; тривиальный, с&nbsp;помощью <a href="http://php.net/set_error_handler">set_error_handler()</a> и&nbsp;других стандартных <a href="http://b23.ru/cub">функций</a> для обработки ошибок. Другой&nbsp;&#8212; через конфигурационные файлы Apache и&nbsp;PHP. На&nbsp;последнем я&nbsp;бы хотел остановиться более подробно. <span id="more-155"></span></p>
<p>Этот способ хорошо подходит в&nbsp;тех случаях, когда речь идет об&nbsp;установке чужих скриптов или есть иная причина, чтобы лишний раз не&nbsp;лезть в&nbsp;код. Способ основан на&nbsp;том факте, что вывод ошибок интерпретатором PHP управляем не&nbsp;только через функции, но&nbsp;и&nbsp;из&nbsp;конфигурационного файла. В&nbsp;свою очередь, параметры <code>php.ini</code> можно переопределять через локальные конфигурационные файлы Apache <code>.htaccess</code>. Таким образом, на&nbsp;одном сервере можно довольно удобно задавать различные настройки для разных директорий и&nbsp;установленных в&nbsp;них скриптов. При этом глобальные настройки останутся незатронутыми, что особенно акуально на&nbsp;shared хостингах, где доступа к&nbsp;ним просто нет.</p>
<p>Содержимое <code>.htaccess</code>:</p>
<pre><code>php_flag display_startup_errors off
php_flag display_errors off
php_flag log_errors on
php_value error_log /home/motoko/logs/errors.log</code></pre>
<p>Приведенные опции полностью отключают вывод ошибок. Параметры <code>log_errors</code> и&nbsp;<code>error_log</code> определяют необходимость записи сообщений в&nbsp;указанный log-файл, который будет выглядеть примерно следующим образом:</p>
<pre><code>[09-Jan-2008 15:11:57] PHP Parse error:  syntax error,
unexpected '=' in /home/motoko/public_html/test_log/index.php on line 3
[09-Jan-2008 15:11:59] PHP Parse error:  syntax error,
unexpected '=' in /home/motoko/public_html/test_log/index.php on line 3
…</code></pre>
<p>Не&nbsp;стоит забывать, что подобные логи в&nbsp;той или иной степени могут содержать информацию о&nbsp;внутреннем устройстве скриптов, и&nbsp;эти сведения не&nbsp;предназначены для открытого доступа. Поэтому файлы с&nbsp;сообщениями об&nbsp;ошибках желательно хранить в&nbsp;недоступной из&nbsp;web директории сервера.</p>
<h3>Ссылки по теме</h3>
<ul>
<li><a href="http://php.net/manual/en/ref.errorfunc.php">Error Handling and Logging Functions</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://paradigm.ru/2008/01/php-errors-log/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->