<?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>Developer Blog &#187; php</title>
	<atom:link href="http://451f.com.ua/category/php-triks/feed" rel="self" type="application/rss+xml" />
	<link>http://451f.com.ua</link>
	<description>developer blog - 451 degrees Fahrenheit</description>
	<lastBuildDate>Sun, 04 Jul 2010 21:22:36 +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>Серверная архитектура Dailymotion.com</title>
		<link>http://451f.com.ua/architecture-dailymotion/312</link>
		<comments>http://451f.com.ua/architecture-dailymotion/312#comments</comments>
		<pubDate>Wed, 20 May 2009 12:59:24 +0000</pubDate>
		<dc:creator>pilot</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[dailymotion]]></category>
		<category><![CDATA[sensil lab]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[производительность]]></category>

		<guid isPermaLink="false">http://451f.com.ua/?p=312</guid>
		<description><![CDATA[Sensio Lab расказала немного о архитектуре видео хостинга Dailymotion 50 web серверов, обрабатывают по 5000 запросов в секунду 17 серверов баз данных 30 memchache серверов, общий объем памяти 210 Гб 1.2 petabytes на хранение данных Этот список не влючает сервера по кодированию видео и обработке поисковых запросов. В общей сложности сайт обслуживают 450 шт. серверов.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dailymotion.com" target="_blank"><img class="size-medium wp-image-315 aligncenter" title="4732_dailymotion" src="http://451f.com.ua/img/2009/05/4732_dailymotion-300x130.jpg" alt="4732_dailymotion" width="300" height="130" /></a><br />
<a href="http://www.sensio-labs.com/" target="_blank">Sensio Lab</a> расказала немного о архитектуре видео хостинга <a href="http://www.dailymotion.com" target="_blank">Dailymotion<br />
</a></p>
<ul>
<li>50 web серверов, обрабатывают по 5000 запросов в секунду</li>
<li>17 серверов баз данных</li>
<li>30 memchache серверов, общий объем памяти 210 Гб</li>
<li>1.2 petabytes на хранение данных</li>
</ul>
<p>Этот список не влючает сервера по кодированию видео и обработке поисковых запросов.</p>
<p>В общей сложности сайт обслуживают 450 шт. серверов.</p>
]]></content:encoded>
			<wfw:commentRss>http://451f.com.ua/architecture-dailymotion/312/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Html DOM parser на PHP</title>
		<link>http://451f.com.ua/php-simple-html-dom-parser-jquery-style/256</link>
		<comments>http://451f.com.ua/php-simple-html-dom-parser-jquery-style/256#comments</comments>
		<pubDate>Mon, 11 Aug 2008 15:36:19 +0000</pubDate>
		<dc:creator>pilot</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[parser]]></category>

		<guid isPermaLink="false">http://451f.com.ua/2008/08/11/php-simple-html-dom-parser-jquery-style/</guid>
		<description><![CDATA[Очень полезный класс для разборки DOM модели веб документа с селектора в&#160; jQuery стиле. Это просто незаменимая вещь если вы любитель обдирать чужие сайты )). А вообще одно из основных применений &#8211; это к примеру брать котировки валют прям со страницы банка и тд. Почему собственно PHP Simple HTML DOM Parser: Написан на PHP5+ и [...]]]></description>
			<content:encoded><![CDATA[<p>Очень полезный <a href="http://simplehtmldom.sourceforge.net/" target="_blank">класс</a> для разборки DOM модели веб документа с селектора в&nbsp; <a href="http://jquery.com/" target="_blank">jQuery</a> стиле.</p>
<blockquote><p><font style="background-color: #ffffff" face="Lucida Sans Unicode">Это просто незаменимая вещь если вы любитель обдирать чужие сайты )). А вообще одно из основных применений &#8211; это к примеру брать котировки валют прям со страницы банка и тд.</font></p>
</blockquote>
<p>Почему собственно <a href="http://simplehtmldom.sourceforge.net/" target="_blank">PHP Simple HTML DOM Parser</a>:</p>
<ul>
<li>Написан на PHP5+ и позволяет легко управлять HTML
<li>Поддерживает не валидный HTML
<li>Поиск тагов в HTML с селекторами в jQuery стиле
<li>Может разложить все содержимое HTML в строку</li>
</ul>
<p>Скачать последнюю версию с <a href="http://sourceforge.net/project/showfiles.php?group_id=218559" target="_blank">Sourceforge</a>.</p>
<p>Онлайн <a href="http://simplehtmldom.sourceforge.net/manual.htm" target="_blank">документация</a>.</p>
<p>Небольшой пример, как извлеть HTML элемент:</p>
<pre>

// Create DOM from URL or file$html = file_get_html('http://www.google.com/');


// Find all images
foreach($html-&gt;find('img') as $element)
  echo $element-&gt;src . '&lt;br&gt;'; 

// Find all links
foreach($html-&gt;find('a') as $element)
  echo $element-&gt;href . '&lt;br&gt;';
</pre>
]]></content:encoded>
			<wfw:commentRss>http://451f.com.ua/php-simple-html-dom-parser-jquery-style/256/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Вот он долгожданный релиз symfony 1.1</title>
		<link>http://451f.com.ua/the-wait-is-over-symfony-1-1-released/90</link>
		<comments>http://451f.com.ua/the-wait-is-over-symfony-1-1-released/90#comments</comments>
		<pubDate>Mon, 30 Jun 2008 13:02:17 +0000</pubDate>
		<dc:creator>pilot</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://451f.com.ua/2008/06/30/the-wait-is-over-symfony-1-1-released/</guid>
		<description><![CDATA[Последнее время разработчики усиленно трудились на новой версией symfony и сегодня этот день настал, можно поздравить разработчиков с выходом нового релиза symfony framework! &#160; Итак список нового функционала в symfony 1.1: Новая архитектура symfony более настраиваяемая и разделенная, позволяет легко использовать или заменять части фреймворка, Новая объекто-ориентированный form framework, позволяет налету создавать формы и повторо [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://451f.com.ua/img/2008/06/release11.png"><img style="border-right: 0px; border-top: 0px; margin: 0px 15px 0px 0px; border-left: 0px; border-bottom: 0px" height="87" alt="release1.1" src="http://451f.com.ua/img/2008/06/release11-thumb.png" width="217" align="left" border="0"></a> Последнее время разработчики усиленно трудились на новой версией symfony и сегодня этот день настал, можно поздравить разработчиков с выходом нового релиза symfony framework!
<p>&nbsp;
<p>Итак список нового функционала в symfony 1.1:
<ul>
<li><a href="http://451f.com.ua/2008/06/24/the-symfony-1-1-architecture/">Новая архитектура symfony</a> более настраиваяемая и разделенная, позволяет легко использовать или заменять части фреймворка,
<li>Новая объекто-ориентированный <a href="http://www.symfony-project.org/book/forms/1_1/">form framework</a>, позволяет налету создавать формы и повторо их использовать,
<li>Совершенно <a href="http://www.symfony-project.org/cookbook/1_1/en/tasks" target="_blank">новая система задач</a> (task system) позволяет быстро создавать рассширяемые батч скрипты и утилиты командной строки,
<li>Теперь Symfony имеет приличный <a href="http://www.symfony-project.org/blog/2008/06/19/yaml-in-symfony-1-1">YAML parser</a>, с подробными сообщениями об ошибках,
<li>Новый менеджер плагинов совместим со стандартом PEAR API, отображает зависимости плагинов, и предлагает набор опций для лучшего управления тем что вы установили,
<li><a href="http://451f.com.ua/2008/06/11/how-to-create-an-optimized-version-of-your-website-for-the-iphone-in-symfony-1-1/" target="_blank">Система обработки форматов</a> позволяет вашему приложению вести себя по разному в зависимости от запроса с iPhone, от поисквого бота, или от браузера,
<li>Propel 1.2 ORM теперь представлен в виде <a href="http://trac.symfony-project.com/browser/branches/1.1/lib/plugins/sfPropelPlugin">плагина</a>, что позволяет вам очень просто перейти на <a href="http://www.symfony-project.org/cookbook/1_1/en/doctrine">Doctrine</a> или <a href="http://www.symfony-project.org/cookbook/1_1/en/propel_13">Propel 1.3</a>,
<li><a href="http://trac.symfony-project.com/browser/branches/1.1/lib/plugins/sfCompat10Plugin">Плагин sfCompat10Plugin</a> обеспечит работу вашего проекта основанного на версии 1.0 после обновления до версии 1.1!
<li>Система роутинга теперь кешируется, что приведет к значительному увеличению производительности если в вашем приложении разветвеленный роутинг. Так же, класс роутинга (routing class) больше не синглтон (singleton), так что теперь можно легко расширять его под свои нужды,
<li>Последнее, не совсем фича, более чем 8,500 юнит и функционал тестов гарантируют общую ставильность кода фреймворка. Количество тестов удвоилось в 1.1 по сравнению с 1.0! </li>
</ul>
<h4>Инсталяция и обновление symfony</h4>
<p>Для инсталяции symfony 1.1 через PEAR, теперь нужно явно указывать какую версию вы хотите установить. И так, если вы хотите установить стабильную 1.1.0 версию, выполняем:
<pre>$ pear install symfony/symfony-1.1.0
</pre>
<p>В случае если вы хотите стабильную 1.0 версию:
<pre>$ pear install symfony/symfony-1.0.17
</pre>
<p>Если вы предпочитаете скачивать самостоятельные архивы, качайте архив <a href="http://www.symfony-project.org/get/symfony-1.1.0.tgz">symfony-1.1.0.tgz</a> или <a href="http://www.symfony-project.org/get/symfony-1.1.0.zip">symfony-1.1.0.zip</a> и распакуйте в любую папку на вашем диске. </p>
<p>Если вы новичек в symfony, для вас доступна урощенная версия &#8220;песочница&#8221; (sandbox) : </p>
<ul>
<li><a href="http://www.symfony-project.org/get/sf_sandbox_1_1.tgz">sf_sandbox_1_1.tgz</a>
<li><a href="http://www.symfony-project.org/get/sf_sandbox_1_1.zip">sf_sandbox_1_1.zip</a></li>
</ul>
<p>Ну и если ты совсем крут и у тебя есть доступ к SVN, просто выполни чекаут ветки 1.1:
<pre>$ svn co http://svn.symfony-project.com/branches/1.1/ /path/to/symfony
</pre>
<p>Все остальное хорошо и в деталях расписано в <a href="http://www.symfony-project.org/installation/1_1">инструкции по установке symfony</a>. </p>
<h4>Обновление существующего проекта </h4>
<p>Если вы планируете обновить существующий на symfony 1.0 проект для использования новой версии 1.1, внимательно прочтите <a href="http://trac.symfony-project.com/browser/branches/1.1/UPGRADE">UPGRADE</a> файл, который есть в каждом дистрибутиве symfony. Если же вы сейчас используете symfony RC2, убедитесь что вы выполняли команду <tt>symfony project:upgrade,</tt>перед тем как обновите библиотеки symfony. </p>
<h4>Относительно документации</h4>
<p><a href="http://www.symfony-project.org/doc/1_1/">Вся документациия</a> обновлена и отображает изменения между symfony 1.0 и новой версией. Комьюнити оправдало наши ожидания и способствовало переводу документации на 10 новых языков менее чем за 15 дней!</p>
<p>В <a href="http://www.symfony-project.org/cookbook/1_1/en/">cookbook</a> добавили несколько полезных примеров и опубликовали первые 4 главы <a href="http://451f.com.ua/2008/06/18/the-symfony-forms-in-action-book-is-online/" target="_blank">книги о новом фреймворке для работы с формами</a>. <a href="http://www.symfony-project.org/api/1_1/">API документация</a> так же поможет вам легко найти все что вам нужно по всему коду symfony. </p>
<h4>Поддержка</h4>
<p>Symfony 1.1, как переходной релиз, будет поддерживаться в течении одного года начиная с 30.06.2008, тогда как 1.0 все еще будет поодерживаться до Января 2010. </p>
<h4>Следующий релиз </h4>
<p>Фабьен и основная команда уже начали работу над новым функционалом версии 1.2, которая будет выходить по датам, а не по новому функионалу. Таже, цикл релизов будет радикально уменьшен (похоже, что разаботчкик будут использовать agile &#8211; scrum методологию). Можно ожидать инетесных фич и улучшений в новом релизе, начиная с совершенно нового генератора админ интерфейса основанного на новой системе работы с формами представленной в symfony 1.1.</p>
]]></content:encoded>
			<wfw:commentRss>http://451f.com.ua/the-wait-is-over-symfony-1-1-released/90/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Архитектура symfony 1.1</title>
		<link>http://451f.com.ua/the-symfony-1-1-architecture/82</link>
		<comments>http://451f.com.ua/the-symfony-1-1-architecture/82#comments</comments>
		<pubDate>Tue, 24 Jun 2008 09:13:41 +0000</pubDate>
		<dc:creator>pilot</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://451f.com.ua/2008/06/24/the-symfony-1-1-architecture/</guid>
		<description><![CDATA[&#160; Перед окончательным релизом symfony 1.1 (который должен произойти уже на этой неделе), Разработчики расказали о новой архитектуре symfony 1.1. Кроме уже существующих новых возможностей, новая версия &#8211; это год сложной работы по внутренней перестройке фреймворка. Итак давайте покапаемся во внутренностях! Платформа symfony (the symfony platform) symfony 1.1 основана на множестве сплоченных, но отдельных классах [...]]]></description>
			<content:encoded><![CDATA[<h3>&nbsp;</h3>
<p>Перед окончательным релизом symfony 1.1 (который должен произойти уже на этой неделе), Разработчики расказали о новой архитектуре symfony 1.1. Кроме уже <a href="http://451f.com.ua/2008/06/11/how-to-create-an-optimized-version-of-your-website-for-the-iphone-in-symfony-1-1/" target="_blank">существующих</a> <a href="http://451f.com.ua/2008/06/18/the-symfony-forms-in-action-book-is-online/" target="_blank">новых</a> <a href="http://www.symfony-project.org/blog/2008/06/14/batches-are-dead-long-life-to-tasks" target="_blank">возможностей</a>, новая версия &#8211; это год сложной работы по внутренней перестройке фреймворка. Итак давайте покапаемся во внутренностях!<br />
<h4>Платформа symfony (the symfony platform)</h4>
<p>symfony 1.1 основана на множестве сплоченных, но отдельных классах &#8211; <strong>symfony platform</strong>:
<p><img alt="The symfony platform" src="http://www.symfony-project.org/uploads/assets/architecture/platform.png">
<p>Каждый класс в symfony platform можно использовать без общей MVC (Модель Вид Контроллер) архитектуры. Классы в symfony platform не имеют зависимостей, только одно условие требуется для их использования &#8211; это предварительная регистрация в symfony autoloader:
<pre>require_once '/path/to/sfCoreAutoload.class.php';
sfCoreAutoload::register(); </pre>
<p>Написав всего пару строк, вы можете использовать любой класс из symfony platform. К примеру если один из ваших проектов не использует symfony, вы все равно можете использовать класс <u>sfYaml</u> просто подключив symfony autoloader:
<pre>require_once '/path/to/sfCoreAutoload.class.php';
sfCoreAutoload::register();// load some YAML file or string
$config = sfYaml::load('/path/to/a/file.yml');
$config = sfYaml::load(&lt;&lt;&lt;EOF
config:
  key: value
  foo: [bar, foobar]
  bar: { bar: foo }
EOF);// dump some array to YAML
$yaml = sfYaml::dump($config);&nbsp; </pre>
<p>То же самое касается всех классов, к примеру класс <u>sfCache</u>:
<pre>require_once '/path/to/sfCoreAutoload.class.php';
sfCoreAutoload::register();$cache = new sfSQLiteCache(array('database' =&gt; dirname(__FILE__).'/cache.db'));
$cache-&gt;set('foo', 'bar');
$value = $cache-&gt;get('foo');&nbsp; </pre>
<p>В примерах используется <u>SQLite</u> backend, но symfony таже предоставляется backends основанные на <u>File</u>, <u>APC</u>, <u>XCache</u>, <u>EACcelerator</u>, и <u>Memcache</u>. </p>
<p>Даже если использование независимых классов кажется естественным, symfony platform пошла на шаг дальше с такими классами как <u>sfRequest</u> или <u>sfResponse</u>. Посмотрим пример где используются эти два класса для создания простого скрипта &#8216;Hello World&#8217;:
<pre>require_once '/path/to/sfCoreAutoload.class.php';
sfCoreAutoload::register();

$dispatcher = new sfEventDispatcher();$request = new sfWebRequest($dispatcher);
$response = new sfWebResponse($dispatcher);$content = 'Hello '.$request-&gt;getParameter('name', 'World');$response-&gt;setContent($content);
$response-&gt;send();&nbsp; </pre>
<p>В этом примере мы используем объект <u>sfEventDispatcher</u>. Даже если классы в платформе полностью разделены, некоторые классы могут общаться друг с другом благодаря диспечеру (dispatcher). Диспечер (dispatcher) преставляет средства для уведомления и прослушивания событий. Вам не нужно создавать интерфейс для прослушивания, и использовать какой-либо специальный класс для создания события; событие определяется только по его имении и массивом параметров отправленых уведомителем (notifier). </p>
<p>К примеру, класс <u>sfPatternRouting</u> прослушивает события <u>request.filter_parameters</u>:
<pre>$callback = array($this, 'filterParameters');
$dispatcher-&gt;connect('request.filter_parameters', $callback);&nbsp; </pre>
<p>И когда зпрос создан, <u>sfWebRequest</u> уведомляет событие <u>request.filter_parameters</u>:
<pre>$event = new sfEvent($this, 'request.filter_parameters');
$parameters = $dispatcher-&gt;filter($event, $parameters);&nbsp; </pre>
<p>Итак, даже если классы <u>sfWebRequest</u> и <u>sfPatternRouting</u> разделены, они автомотичеки общаются друг с другом, когда они разделяют общий диспечер (dispatcher). </p>
<p>Чтоб представить эту возможность, изменим чуток в предыдущем примере, добавим объект роутинга (routing object), который подключается к приложению &#8216;Hello World&#8217; по шабону <u>/hello/:name</u>:
<pre>require_once '/path/to/sfCoreAutoload.class.php';
sfCoreAutoload::register();$dispatcher = new sfEventDispatcher();$routing = new sfPatternRouting($dispatcher);
$routing-&gt;connect('hello', '/hello/name');$request = new sfWebRequest($dispatcher);
$response = new sfWebResponse($dispatcher);$content = 'Hello '.$request-&gt;getParameter('name', 'World');$response-&gt;setContent($content);
$response-&gt;send();&nbsp; </pre>
<p>Теперь, если вы сохраните этот скрипт как <u>index.php</u> в root папке вашего веб сервера, вы можете увидеть работу приложения набрав в браузе, к примеру <u>/index.php/hello/451fahrenheit</u>. </p>
<p>Это хорошо если вы хотите использовать некоторые интересные функции, которые предлагает symfony, без использования всей MVC архитектуры. </p>
<p>Это так же прекрасный способ перевести ваше старое приложение на symfony. Вместо того, чтоб переписывать все с нуля, вы можете ввести концепцию symfony один раз. </p>
<p>Вы так же можете создать свой собственных фреймворк основаный на symfony platform. Вам не нужно выдумывать колесо, symfony platform все что вам нужно для создания классного фреймворка: </p>
<ul>
<li><u>sfRequest</u>/<u>sfRouting</u>: Запросы
<li><u>sfUser</u>/<u>sfStorage</u>: Пользователь/Сессии
<li><u>sfForm</u>: Фреймворк для создания форм&nbsp;
<li><u>sfCache</u>: Работа с кешем&nbsp;
<li><u>sfOutputEscaper</u>: Защита от&nbsp; XSS атак </p>
<li><u>sfResponse</u>: Ответы
<li>&#8230; </li>
</ul>
<p>Конечно, <strong>symfony framework</strong> сам основан на <strong>symfony platform</strong>: </p>
<p><img alt="The symfony MVC framework" src="http://www.symfony-project.org/uploads/assets/architecture/mvc.png"> </p>
<p>Класс <u>sfConfiguration</u> предлагает способ для конфигурирования и настройки вашего приложения. Класс <u>sfContext</u>&nbsp; действует как регистр который хранит ссылки на все объекты ядра. И благодаря конфигурационному файлу <u>factories.yml</u>, вы очень легко можете настраивать все зарегистрированные классы, всего лишь&nbsp; отредактировав YAML файл. </p>
<p><strong>Symfony MVC framework</strong> предлагает ряд дополнительных классов на вершине <strong>symfony framework</strong>, как показно ниже: </p>
<p><img alt="The symfony MVC framework" src="http://www.symfony-project.org/uploads/assets/architecture/framework.png"> </p>
<p><em>Слой Модели (Model layer)</em>&nbsp; предствален сторонними библиотеками, Propel или Doctrine. Даже если symfony 1.1 связана с плагином Propel, нет ничего проще перейти на Doctrine, установив <u>sfDoctrinePlugin</u>. Обе ORMs предлагают одинаковый уровень интеграции с symfony. </p>
<p><em>Слой Вид (View layer)</em> представлен классом <u>sfView</u> , набором хелперов (helpers), и шаболнами (templates) разработчика. </p>
<p><em>Слой Контроллер (Controller layer)</em> основан на цепочке фильтров (filter chine) и действий (actions) определенных разработчиком. </p>
<p>Начиная с версии 1.1, symfony одним из наиболее разделенных фреймворков существующих на PHP, даже болше чем Zend Framework. К примеру,&nbsp; <u>sfForm</u> фреймворк используется без любых классов MVC в отличии от <u>Zend_Form</u> который несколько привязан к слоям контроллер и вид (controller and view layers).</p>
]]></content:encoded>
			<wfw:commentRss>http://451f.com.ua/the-symfony-1-1-architecture/82/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Aptana Cloud &#8211; платформа для организации Cloud Computing</title>
		<link>http://451f.com.ua/aptana-cloud-platform/65</link>
		<comments>http://451f.com.ua/aptana-cloud-platform/65#comments</comments>
		<pubDate>Fri, 13 Jun 2008 07:34:49 +0000</pubDate>
		<dc:creator>pilot</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[aptana]]></category>
		<category><![CDATA[cloud computing]]></category>

		<guid isPermaLink="false">http://451f.com.ua/?p=65</guid>
		<description><![CDATA[Aptana Cloud &#8211; это Elastic Application Cloud, прозрачно масштабируемая сетевая инфраструктура для развертывания веб-приложений. Совместно с серверной поддержкой, будет добавлен соответствующий инструментарий и в среду разработки Aptana IDE, с которой напрямую можно будет развертывать приложения, управлять доступными настройками, отлаживать и контролировать свой проект. Среда, по заявлению, идеально подойдет для разработчиков современных Web 2.0 проектов, принимая [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abrdev.com/?p=342"><img class="alignnone size-medium wp-image-64" title="aptanacloudslogo" src="http://451f.com.ua/img/2008/06/aptanacloudslogo-300x121.png" alt="" width="300" height="121" /></a></p>
<p><a href="http://www.aptana.com/cloud">Aptana Cloud</a> &#8211; это Elastic Application Cloud, прозрачно масштабируемая сетевая инфраструктура для развертывания веб-приложений. Совместно с серверной поддержкой, будет добавлен соответствующий инструментарий и в среду разработки Aptana IDE, с которой напрямую можно будет развертывать приложения, управлять доступными настройками, отлаживать и контролировать свой проект. Среда, по заявлению, идеально подойдет для разработчиков современных Web 2.0 проектов, принимая на себя заботу об масштабировании сетевой и серверной инфраструктуры, оставляя разработчикам только разработку и ничего больше.</p>
<p><a href="http://abrdev.com/?p=342">Подробнее здесь</a></p>
]]></content:encoded>
			<wfw:commentRss>http://451f.com.ua/aptana-cloud-platform/65/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Рисуем свой pdf файл на php, часть 2</title>
		<link>http://451f.com.ua/create-pdf-file-on-php-part2/6</link>
		<comments>http://451f.com.ua/create-pdf-file-on-php-part2/6#comments</comments>
		<pubDate>Sat, 27 Oct 2007 23:20:23 +0000</pubDate>
		<dc:creator>pilot</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[fpdf]]></category>
		<category><![CDATA[print pdf]]></category>

		<guid isPermaLink="false">http://451f.com.ua/2007/10/28/%d1%80%d0%b8%d1%81%d1%83%d0%b5%d0%bc-%d1%81%d0%b2%d0%be%d0%b9-pdf-%d1%84%d0%b0%d0%b9%d0%bb-%d0%bd%d0%b0-php-%d1%87%d0%b0%d1%81%d1%82%d1%8c-2/</guid>
		<description><![CDATA[В первой части я расказал, с чего все началось, и что было выбрано как инструмент для решения задачи. Итак бибилиотеке fpdf 1.5.3 , скачиваем, распаковываем к себе на сервер в любую папку, к примеру pdf, после распаковки получаем следующую структуру папок: У себя я использую пакет denver от dklab.ru, либо XAMPP http://www.apachefriends.org/en/xampp.html, который включает полный [...]]]></description>
			<content:encoded><![CDATA[<p>В первой части я расказал, с чего все началось, и что было выбрано как инструмент для решения задачи.</p>
<p>Итак бибилиотеке <strong>fpdf 1.5.3</strong> , скачиваем, распаковываем к себе на сервер в любую папку, к примеру <strong>pdf</strong>, после<strong> </strong>распаковки получаем следующую структуру папок:</p>
<blockquote><p>У себя я использую пакет denver от dklab.ru, либо XAMPP <a href="http://www.apachefriends.org/en/xampp.html">http://www.apachefriends.org/en/xampp.html</a>, который включает полный пакет программ необходимых веб разработчику. К тому же XAMPP подойдет как тем кто любит Linux, так и Windwos разработчикам.</p></blockquote>
<p><font color="#008000"><strong>pdf/</strong><br />
-doc/<br />
<strong>-font/</strong><br />
-tutorial/<br />
-FAQ.htm<br />
-fpdf.css<br />
<strong>-fpdf.php</strong><br />
-histo.htm<br />
-install.txt</font></p>
<p>Оставляем только необходимое папку <strong>font/</strong> и <strong>fpdf.php. </strong>Конечно, у кого есть немного времени чтоб ознакомиться с примерами из папки <strong>tutorial/, </strong>вы не пожалеете, примеры показывают практически исчерпывающую информацию по работе с fpdf.</p>
<p>Для начала создамим первый простой pdf файл, создайте pdf/test.php, с кодом:</p>
<p>[cc lang="php"]<br />
require(&#8216;fpdf.php&#8217;);</p>
<p>$pdf = new FPDF();<br />
$pdf->AddPage();<br />
$pdf->SetFont(&#8216;Arial&#8217;,'B&#8217;,16);<br />
$pdf->Cell(40,10,&#8217;Hello World!&#8217;);<br />
$pdf->Output();<br />
[/cc]</p>
<p>Первой строчкой мы подключаем библиотеку, далее:</p>
<p>[cc lang="php"]$pdf = new FPDF(); // Создаем новый объект[/cc]</p>
<p>Изначально наш pdf файл пуст, по-этому добавляем в наш pdf, новый лист:</p>
<p>[cc lang="php"]$pdf->AddPage(); // по умолчанию создется лист формата А4[/cc]</p>
<p>Перед выводом любого текста, предварительно нужно задать шрифт, в противном случае при создание будет сообщено об ошибке:<br />
[cc lang="php"]$pdf->SetFont(&#8216;Arial&#8217;,'B&#8217;,16);[/cc]</p>
<p>И вот теперь мы может напечатать свой первый текст в первом pdf файле, с помощью функции <a href="http://fpdf.org/en/doc/cell.htm">Сell()</a>, эта функция нарисует прямоугольную область с надписью внутри. Фактически будет выведена ячейка таблицы с текстом внутри.</p>
<p>[cc lang="php"]Cell(40,10,&#8217;Hello World!&#8217;);[/cc]</p>
<p>Для вывода просто текста используюется функция <a href="http://fpdf.org/en/doc/write.htm">Write()</a>, а для перевода на новую строку отдельная функция <a href="http://fpdf.org/en/doc/ln.htm">Ln()</a>:</p>
<p>[cc lang="php"]<br />
$pdf->Ln(); // перевод картеки на новую строку<br />
$pdf->Write(4, &#8220;текс для вывода&#8221;); // значение 4 означение высоту строки<br />
[/cc]</p>
<p>Выводим сам pdf, с помощью функции <a href="http://fpdf.org/en/doc/output.htm">Output()</a>, которая может принимать несколько значний, <a href="http://fpdf.org/en/doc/output.htm">Output(&#8220;пусть/имя.pdf&#8221;, dest)</a> имя выводимого файла, и второй необязательный параметр как будет выводиться файл, сразу в броузер либо сохранен на диск:</p>
<p>[cc lang="php"]$pdf->Output();[/cc]</p>
<p>Вот и создан первый pdf файл, на практиче простые текстовые файлы создаются довольно просто и библиотека работает безупречно.</p>
<p>И так вывод тикетов в pdf файл, ниже я буду давать php код с минимумом текстовых коментариев, так как основные принципы создания pdf файла я описал выше&#8230;</p>
<p><span id="more-6"></span></p>
<p>На входе у меня инфомация из базы данных, приведу только пример массива полученного после выборки части текста, который будет печататься на тикетах:</p>
<p>[cc lang="php"]<br />
// Входящий массив &#8211; список идентификаторов отелей<br />
$idhostel(&#8217;12&#8242;,&#8217;14&#8242;,&#8217;43&#8242;,&#8217;45&#8242;,&#8217;54&#8242;,&#8217;67&#8242;);</p>
<p>$pdf = new PDF();  // Создаем новый объект</p>
<p>$pages = ceil(count($idhostel)/27); // 27 тикетов на стрнице, считаем количество страниц</p>
<p>for ($p = 1; $p < ($pages+1); $p++){<br />
if (count($idhostel) > 27) $to = 27; else $to = count($idhostel);<br />
for ($i = 0; $i < $to; $i++){</p>
<p>// array_shift() - удаляем из массива $idhostel обработанный id<br />
$sql = "SELECT name, street, zip, city, country FROM fe_hostels WHERE idhostel='".array_shift($idhostel)."'";<br />
$result = DB::getRow($sql); // getRow() из класса работы с базой, у каждого свой.<br />
$hostel[] = $result;<br />
}</p>
<p>// Информация для отладки, попробуйте с ней.<br />
//echo "page: ".$p.""; // Текущая страница<br />
//print_r($hostel); // Массив данных для вывода на тикеты<br />
//echo "<br />&#8220;;</p>
<p>// Добавляем новую странцу<br />
$pdf->AddPage();<br />
// Рисуем прямоугольники &#8211; моя функция описание ниже<br />
//$pdf->pageRect();<br />
// Пишем текст на тикетах &#8211; моя функция описание ниже<br />
$pdf->printText($hostel);<br />
// После вывода очищаем массив с данными предыдущей страницы<br />
unset($hostel);<br />
}</p>
<p>// Рисуем pdf, параметр D &#8211; отправить в бороузер и предложить скачать.<br />
$pdf->Output(&#8220;&#8221;, &#8220;D&#8221;);<br />
[/cc]</p>
<p>Выше показан основной код, который создает новый объект класса PDF(), который в свою очередь является расширением (extends) класса FPDF нашей библиотеки, ниже приведен код моему класса, который непосредственно рисует закрашенный прямоугольники, выводит текст с переносом на следующую строки и перестройкой каждой последующей строки.</p>
<blockquote><p>Замечу, что при выводе текста с помощью функции <a href="http://fpdf.org/en/doc/write.htm">Write()</a> возникает проблема переноса текста на следующую строку. Перед тем как начать вывод нужно задать координаты вывода функцией <a href="http://fpdf.org/en/doc/setxy.htm">SetXY()</a>, а следовательно и контролировать эти координа при переносах строк.</p></blockquote>
<p>Показанный ниже код нужно вставить перед</p>
<p>[cc lang="php"]$pdf = new PDF();[/cc]</p>
<p>В коде я обрезал вывод метов класса PDF(), полный вывод каждого метода вы можете скачать одним файлом, в конце статьи.</p>
<p>[cc lang="php"]<br />
include(&#8220;fpdf.php&#8221;);<br />
class PDF extends FPDF {</p>
<p>// Рисуем зарашенные прямоугольники<br />
function pageRect(){<br />
$this->SetFillColor(153,204,255); // Задаем цвет фона<br />
// Рисем прямоугольники 3 колонки по 27 штук<br />
$k = 16;<br />
for ($i = 1; $i < 10; $i++){<br />
$this->Rect(8,$k,63,29.4,&#8217;FD&#8217;);<br />
$this->Rect(73.5,$k,63,29.4,&#8217;FD&#8217;);<br />
$this->Rect(139,$k,63,29.4,&#8217;FD&#8217;);<br />
$k = $k + 29.4;<br />
}<br />
}<br />
// Разбиваем длиные имена отелей<br />
function splitName($longname, $col_st, $b){<br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;   // полную версию вы можете скачать ниже<br />
return $st;<br />
}</p>
<p>// Декодируем html мнемоники<br />
function decoder($text){<br />
$text = utf8_decode(html_entity_decode($text, ENT_QUOTES));<br />
return $text;<br />
}</p>
<p>// Печатаем текст на тикетах<br />
function printText ($hostel){<br />
$a = 18; // Задаем координаты смещения для каждой строки<br />
$b = 22;<br />
$c = 26;<br />
$d = 31;<br />
$e = 36;</p>
<p>for ($i = 0; $i < count($hostel); $i += 3){<br />
// Печатаем текст<br />
$this->SetXY(10,$a);<br />
$this->SetFont(&#8216;Arial&#8217;,'U&#8217;,6);<br />
$this->Write(4,$this->decoder(&#8217;451f.com.ua &#8211; записи разработчика&#8217;));</p>
<p>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.  // полную версию вы можете скачать ниже</p>
<p>$a = $a + 29.4; // Задаем приращение, высота прямоуголька 29.4 мм<br />
$b = $b + 29.4;<br />
$c = $c + 29.4;<br />
$d = $d + 29.4;<br />
$e = $e + 29.4;<br />
}</p>
<p>}<br />
}</p>
<p>[/cc]</p>
<p>Оставляйте ваши коментарии, и не забудьте подписать на <a href="http://451f.com.ua/feed/" title="RSS">RSS</a> и <a href="http://feeds.feedburner.com/451f" title="feedburner">e-mail</a> рассылку.</p>
<p>Скачать полную версию <a href="http://451f.com.ua/img/2007/10/tickets.txt" title="ticket.php">ticket.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://451f.com.ua/create-pdf-file-on-php-part2/6/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Рисуем свой pdf файл на php, часть 1</title>
		<link>http://451f.com.ua/create-pdf-file-on-php/3</link>
		<comments>http://451f.com.ua/create-pdf-file-on-php/3#comments</comments>
		<pubDate>Thu, 25 Oct 2007 19:54:05 +0000</pubDate>
		<dc:creator>pilot</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[fpdf]]></category>
		<category><![CDATA[pdflib]]></category>
		<category><![CDATA[print pdf]]></category>

		<guid isPermaLink="false">http://451f/2007/10/25/%d0%a0%d0%b8%d1%81%d1%83%d0%b5%d0%bc-%d1%81%d0%b2%d0%be%d0%b9-pdf/</guid>
		<description><![CDATA[При работе над одним проектом возникла задача вывести тикеты (tickets) на предварительно порезанной самоклеющейся бумаге. Из трех решений данной задачи: Выводить простым html &#8216; лем (и конвертировать в pdf) Нарисовать gif картинку Нарисовать pdf был выбран вариант №3 &#8211; нарисовать pdf, исходя из того, что в первом варианте вывод на печать в разных броузеров значительно [...]]]></description>
			<content:encoded><![CDATA[<p>При работе над одним проектом возникла задача вывести тикеты (tickets) на предварительно порезанной самоклеющейся бумаге.</p>
<p>Из трех решений данной задачи:</p>
<ol>
<li> Выводить простым html &#8216; лем (и конвертировать в pdf)</li>
<li> Нарисовать gif картинку</li>
<li> Нарисовать pdf</li>
</ol>
<p>был выбран вариант №3 &#8211; <strong>нарисовать pdf</strong>, исходя из того, что в <em>первом варианте</em> вывод на печать в разных броузеров значительно отличается и выводить html, который требуется сформировать под вывод на печать основных броузеров, не целесообразно. <em>Второй вариант </em>- вывод в картинку, не подходил так как во время вывода изображения теряется качество выводимого текста.</p>
<p>Выбранный в итоге вариант рисования своего <strong>pdf</strong>, как оказалось на практике не так легко воплотить.</p>
<p>Первое, что нужно выбрать, библиотеку для рисования pdf.</p>
<p>При беглом обзоре с гуглом, попались:</p>
<ol>
<li><a href="http://www.pdflib.com/products/pdflib-family/"> pdflib</a></li>
<li><a href="http://www.fpdf.org/"> fpdf153</a></li>
<li><a href="http://html2fpdf.sourceforge.net">html2fpdf-3.0.2b</a> — конвертер из html</li>
<li><a href="http://www.digitaljunkies.ca/dompdf/"> dompdf-0.5.1</a> — конвертер из html</li>
</ol>
<p>Выбор был остановлен на fpdf153, почему?</p>
<p>Самый простой вариант, который меня устраивал  — это использовать <em>конвертер из html в pdf , </em>но полученный результат конвертирования меня не устроил, так как пердставленые бесплатные конвертеры могут корректно выполнять конвертацию только простых html файлов без использования блоков div. В основном простых таблиц обозначенных бордерами.</p>
<blockquote><p>Кого заинтересовали мои исследования в области конвертации из <strong>html</strong> в <strong>pdf</strong>, пишите в комментариях. Так как во время поиска конвертера я протестировал несколько коммерческих продуктов, которые при наличии средств можно использовать вместо того, чтоб заниматься конвертацией и доделкой бесплатных библиотек самому.</p></blockquote>
<p>Рисовалка pdf файлов <strong>pdflib </strong>доступная как модуль расширения <strong>php</strong> хорошо документированная, оказалась для меня не доступной так как хостиг провайдер заказчика, отказался добавлять эту библиотеку.  В итоге для работы я выбрал библиотеку <strong>fpdf</strong> последняя доступная версия 1.5.3 , сайт разработчика <a href="http://www.fpdf.org/">www.fpdf.org</a>  Русская документация по fpdf library качаем по ссылке <a href="http://www.fpdf.org/en/dl.php?id=92">http://www.fpdf.org/en/dl.php?id=92</a></p>
<p>С библиотекой все ясно, приступаем непосредственно к самому моменту рисования pdf файла, об этом во подробно во второй части&#8230;</p>
<blockquote><p>У кого есть личный примеры работы с <strong>fpdf</strong>, пишите свои примеры, буду рад разместить ваш опыт на страницах этого дневника.</p></blockquote>
<p>Не забудьте подписаться на <a href="http://451f.com.ua/feed/" title="RSS">RSS</a> и <a href="http://feeds.feedburner.com/451f" title="feedburner">e-mail</a> рассылку.</p>
]]></content:encoded>
			<wfw:commentRss>http://451f.com.ua/create-pdf-file-on-php/3/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
