<?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; Tutorials</title>
	<atom:link href="http://blog.xyz.net.ua/category/tutorials/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.xyz.net.ua</link>
	<description>блог программиста</description>
	<lastBuildDate>Sat, 17 Apr 2010 08:34:56 +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>Проверка URL на валидность (preg_match) в PHP</title>
		<link>http://blog.xyz.net.ua/2010/04/15/url_validation_preg_mtch/</link>
		<comments>http://blog.xyz.net.ua/2010/04/15/url_validation_preg_mtch/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 06:46:12 +0000</pubDate>
		<dc:creator>Петька Сокольников</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[PCRE]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.xyz.net.ua/?p=97</guid>
		<description><![CDATA[Нужен был рег для проверки корректности введенного URL. Для примера был взят один отсюда, но немного дописан. Добавлена возможность принимать урлы с указанием порта, а также разрешено использование в адресе (не домене) символов &#171;()*&#187; (причем это позволено RFC 1738) и кириллицы (да, появилась нужда принимать и обрабатывать такие адреса без предварительного rawurlencode()). $file_now = "http://www.domain.net.ua:8080/48649c6575cab899e6841aea6563e72a/down/3878/Abcde(FGH*).avi#dfbdf-dfb"; [...]]]></description>
			<content:encoded><![CDATA[<p>Нужен был рег для проверки корректности введенного URL. Для примера был взят один <a href="http://htmlweb.ru/php/example/preg.php" target="_blank">отсюда</a>, но немного дописан.<br />
Добавлена возможность принимать урлы с указанием порта, а также разрешено использование в  адресе (не домене) символов &laquo;()*&raquo; (<em>причем это позволено RFC 1738</em>) и кириллицы (да, появилась нужда принимать и обрабатывать такие адреса без предварительного<em> rawurlencode()</em>). </p>
<p><span id="more-97"></span></p>
<blockquote><p><code></p>
<p>$file_now = "http://www.domain.net.ua:8080/48649c6575cab899e6841aea6563e72a/down/3878/Abcde(FGH*).avi#dfbdf-dfb";</p>
<p>if (preg_match("~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}".<br />
   "(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|".<br />
   "org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?".<br />
   "!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(:[0-9]{1,5})?(?:/[а-яa-z0-9.,_@%\(\)\*&#038;".<br />
   "?+=\~/-]*)?(?:#[^ '\"&#038;<>]*)?$~i", $file_now))<br />
   		 print "Correct!";<br />
else print "Incorrect...";<br />
</code></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.xyz.net.ua/2010/04/15/url_validation_preg_mtch/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Автоматизированное создание сложных HTML-карт (map &amp; area)</title>
		<link>http://blog.xyz.net.ua/2009/09/11/html_map_and_area/</link>
		<comments>http://blog.xyz.net.ua/2009/09/11/html_map_and_area/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 13:30:20 +0000</pubDate>
		<dc:creator>Петька Сокольников</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Adobe ImageReady]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[map]]></category>

		<guid isPermaLink="false">http://blog.xyz.net.ua/?p=52</guid>
		<description><![CDATA[Во время разработки одного из проектов появилась нужда сделать сложную HTML-карту. До этого сталкивался с более простыми, когда у какого-либо изображения надо было выделеть пару-тройку активных областей в виде прямоугольника или круга. Зная размеры изображения прикинуть координаты этих областей можно и на глаз, и потом, если что, то немного подогнать. Но как быть, когда сделать [...]]]></description>
			<content:encoded><![CDATA[<p>Во время разработки одного из проектов появилась нужда сделать сложную HTML-карту. До этого сталкивался с более простыми, когда у какого-либо изображения надо было выделеть пару-тройку активных областей в виде прямоугольника или круга. Зная размеры изображения прикинуть координаты этих областей можно и на глаз, и потом, если что, то немного подогнать.</p>
<p><img class="aligncenter size-full wp-image-53" title="map_example" src="http://blog.xyz.net.ua/wp-content/uploads/2009/09/map_example.jpg" alt="map_example" width="309" height="440" /></p>
<p>Но как быть, когда сделать карту надо посложнее, как на картинке выше? Понятное дело, что подобрать координаты границ таких ломанных областей на глаз не получится, и надо какое-нибудь средство, которое бы помогло нам в этом. Таким средством у нас будет <strong>Adobe ImageReady</strong></p>
<p><strong> </strong><span id="more-52"></span></p>
<p>Для начала открываем наше изображение, на котором необходимо сделать активную карту в Adobe ImageReady (я использую версию CS).</p>
<div id="attachment_55" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.xyz.net.ua/wp-content/uploads/2009/09/screen_1.jpg"><img class="size-medium wp-image-55" title="screen_1" src="http://blog.xyz.net.ua/wp-content/uploads/2009/09/screen_1-300x174.jpg" alt="screen_1" width="300" height="174" /></a><p class="wp-caption-text">Рис. 1: Открытый проект с изображением. (кликабельно)</p></div>
<p style="text-align: center;">
<p style="text-align: left;">Выделяем область, которая должна быть активной. В моем случае для этого можно использовать <strong>Magic Wang Tool.</strong></p>
<p style="text-align: left;"><strong> </strong></p>
<div id="attachment_56" class="wp-caption aligncenter" style="width: 310px"><strong><strong><a href="http://blog.xyz.net.ua/wp-content/uploads/2009/09/screen_2.jpg"><img class="size-medium wp-image-56" title="screen_2" src="http://blog.xyz.net.ua/wp-content/uploads/2009/09/screen_2-300x174.jpg" alt="Рис. 2: выделение участка изображения." width="300" height="174" /></a></strong></strong><p class="wp-caption-text">Рис. 2: выделение участка изображения.</p></div>
<p><strong> </strong>После этого в списке слоёв жмем правой кнопкой мыши, и выбираем <strong>Layer via copy</strong>. Таким образом получается новый слой, в котором содержится выделенный участок изображения. На полученном слое тоже жмем правой кнопкой мыши и выбираем опцию <strong>New Layer Based Image Map Area</strong>.<br />
Далее открываем панель для работы с html-картой. Для этого в меню <strong>Window</strong> ставим галочку напротив <strong>Image Map</strong>.</p>
<p style="text-align: left;">
<div id="attachment_57" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.xyz.net.ua/wp-content/uploads/2009/09/screen_4.jpg"><img class="size-medium wp-image-57" title="screen_4" src="http://blog.xyz.net.ua/wp-content/uploads/2009/09/screen_4-300x174.jpg" alt="Рис. 3: включение панели Image Map" width="300" height="174" /></a><p class="wp-caption-text">Рис. 3: включение панели Image Map</p></div>
<p>Там для текущего участка карты устанавливаем параметры URL, Traget, Alt (надеюсь не надо объяснять что это), а так же выбираем <strong>Shape: Polygon</strong> и выбираем уровень качества (больше качества &#8211; больше точности, но на выходе получим больше кода, поэтому смотрите сами).<br />
Таким образом мы имеем одну выделенную область. Далее возвращаемся в слой с картой, и проделываем опять все операции с новой областью.</p>
<p style="text-align: left;">Когда все области выделенны, делаем <strong>File &#8211; Save Optimized As, </strong>и сохраняем оптимизрованный результат.<br />
Если всё сделали правильно, то на выходе мы должны получить папку с картой, и html-документ с размеченной картой.</p>
<p style="text-align: left;">То, что получилось в итоге у меня можно посмотреть тут: <a href="http://tutorials.xyz.net.ua/html_map_and_area/" target="_blank">http://tutorials.xyz.net.ua/html_map_and_area/</a><br />
На практике карту, размеченную в Adobe ImageReady я использовал в верстке макета для <a href="http://getfreunde.de" target="_blank">getfreunde.de</a>, который можно посмотреть тут: <a href="http://portfolio.xyz.net.ua/getfreunde" target="_blank">http://portfolio.xyz.net.ua/getfreunde</a>.</p>
<p style="text-align: center;">
]]></content:encoded>
			<wfw:commentRss>http://blog.xyz.net.ua/2009/09/11/html_map_and_area/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Excel-файл из PHP</title>
		<link>http://blog.xyz.net.ua/2009/05/08/php_to_excel/</link>
		<comments>http://blog.xyz.net.ua/2009/05/08/php_to_excel/#comments</comments>
		<pubDate>Fri, 08 May 2009 06:27:26 +0000</pubDate>
		<dc:creator>Петька Сокольников</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.xyz.net.ua/?p=36</guid>
		<description><![CDATA[Появилась задача создания простых таблиц excel налету. В принципе, если поискть в сети, то можно найти ряд готовых инструментов для создания *.xls файлов. Делюсь с вами коротким обзором. Spreadsheet_Excel_Writer &#8211; целый пакет для решения подобных задач. Но необходимо наличие PEAR на сервере, а в подавляющем большинстве виртуальных хостингов PEAR не подключен. Конечно, можно собрать все [...]]]></description>
			<content:encoded><![CDATA[<p>Появилась задача создания простых таблиц excel налету.<br />
В принципе, если поискть в сети, то можно найти ряд готовых инструментов для создания *.xls файлов.<br />
Делюсь с вами коротким обзором.</p>
<p><span id="more-36"></span><br />
<a href="http://pear.php.net/package/Spreadsheet_Excel_Writer"  target="_blank">Spreadsheet_Excel_Writer</a> &#8211; целый пакет для решения подобных задач. Но необходимо наличие PEAR на сервере, а в подавляющем большинстве виртуальных хостингов PEAR не подключен. Конечно, можно собрать все файлы пакета в одном месте, поиграться с путями, но в моем случае овчинка не стоит выделки.</p>
<p>Можно генерить xls-файлы используя COM-объекты (пример: <a href="http://www.spravkaweb.ru/php/sovet/excelcom" target="_blank">http://www.spravkaweb.ru/php/sovet/excelcom</a>), но COM &#8212; это это прерогатива windows-серверов, поэтому и этот вариант отпадает.</p>
<p><a href="http://sourceforge.net/projects/psxlsgen/" target="_blank">PHP Simple Excel File Generator</a> &#8211; рабочее название <strong>psxlsgen</strong>. Класс для генерирования excel-файлов. Честно говорю, что не успел попробовать его в работе. Может когда-нибудь придется и его поковырять.</p>
<p>Ну и конечно можно поискать другие классы для решения нашей задачи на <a href="http://www.phpclasses.org/" target="_blank">http://www.phpclasses.org/</a> по ключам <a  target="_blank" href="http://www.google.com/custom?domains=www.phpclasses.org&#038;q=excel+php&#038;sa=Search&#038;sitesearch=www.phpclasses.org&#038;client=pub-2951707118576741&#038;forid=1&#038;channel=5742870948&#038;ie=ISO-8859-1&#038;oe=ISO-8859-1&#038;cof=GALT%3A%23663399%3BGL%3A1%3BDIV%3A%23222222%3BVLC%3A663399%3BAH%3Acenter%3BBGC%3A%23e4e4e8%3BLBGC%3A%23e4e4e8%3BALC%3A0000FF%3BLC%3A0000FF%3BT%3A000000%3BGFNT%3A0000FF%3BGIMP%3A0000FF%3BLH%3A50%3BLW%3A256%3BL%3Ahttp%3A%2F%2Ffiles.phpclasses.org%2Fgraphics%2Fgooglesearch.gif%3BS%3Ahttp%3A%2F%2Fwww.phpclasses.org%2Fsearch.html%3BFORID%3A1%3B&#038;hl=en">excel php</a></p>
<p>Но для решения моей задачи не пригодилось ничего из описанного мной выше. Ведь excel запросто понимает html-код. Поэтому мне для создания простого списка элементов в excel достаточно было сгенерировать html-страницу c отправкой соответствующих заголовков.</p>
<p><strong>Пример:</strong></p>
<blockquote><p>&lt;?PHP<br />
header(&laquo;Content-Type: application/vnd.ms-excel&raquo;);<br />
header(&laquo;Content-Disposition: attachment; filename=file.xls&raquo;);<br />
header(&laquo;Content-Transfer-Encoding: binary&raquo;);</P><P>print &raquo;<br />
&lt;table border=\&raquo;1\&raquo;&gt;<br />
&nbsp;&lt;tr&gt;<br />
&nbsp; &lt;td width=\&raquo;200\&raquo;&gt;&lt;b&gt;Заголовок 1&lt;/b&gt;&lt;/td&gt;<br />
&nbsp; &lt;td&gt;&lt;b&gt;Заголовок 1&lt;/b&gt;&lt;/td&gt;<br />
&nbsp;&lt;/tr&gt;<br />
&nbsp;&lt;tr&gt;<br />
&nbsp; &lt;td&gt;Элемент 1&lt;/td&gt;<br />
&nbsp; &lt;td&gt;Описание 1&lt;/td&gt;<br />
&nbsp;&lt;/tr&gt;<br />
&nbsp;&lt;tr&gt;<br />
&nbsp; &lt;td&gt;Элемент 2&lt;/td&gt;<br />
&nbsp; &lt;td&gt;Описание 2&lt;/td&gt;<br />
&nbsp;&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&laquo;;<br />
?&gt;</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.xyz.net.ua/2009/05/08/php_to_excel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Плавная смена изображений на JavaScript</title>
		<link>http://blog.xyz.net.ua/2009/05/06/css3_javascript_opacity/</link>
		<comments>http://blog.xyz.net.ua/2009/05/06/css3_javascript_opacity/#comments</comments>
		<pubDate>Wed, 06 May 2009 16:30:09 +0000</pubDate>
		<dc:creator>Петька Сокольников</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[opacity]]></category>

		<guid isPermaLink="false">http://blog.xyz.net.ua/?p=24</guid>
		<description><![CDATA[Как то появилась задача сделать плавную смену изображений в web-странице. Решением задачи решил поделиться с вами. Некоторые используют для этого CSS-свойство filter, но понимает его только Internet Explorer, поэтому пришлось искать реализацию, которая работала бы в разных браузерах. Сначала немного теории. Используя абсолютное позиционирование, набрасываем в разные слои несколько изображений. И только одно из них [...]]]></description>
			<content:encoded><![CDATA[<p>Как то появилась задача сделать плавную смену изображений в web-странице. Решением задачи решил поделиться с вами. Некоторые используют для этого CSS-свойство <strong>filter</strong>, но понимает его только <strong>Internet Explorer</strong>, поэтому пришлось искать реализацию, которая работала бы в разных браузерах.</p>
<p><span id="more-24"></span><br />
<strong>Сначала немного теории. </strong><br />
Используя абсолютное позиционирование, набрасываем в разные слои несколько изображений. И только одно из них должно отображаться сразу, а остальные проявляться со временем.<br />
Чтобы сделать плавную смену одного изображения другим, надо играться со свойствами прозрачности. Любой нормальный браузер понимает CSS3-свойство <a href="http://www.htmlbook.ru/css/opacity.html" target=_blank>opacity</a> (принимает значение от 0 до 1), любой но только не Internet Explorer, для него тоже самое приходится делать при помощи <strong>filter: alpha(opacity)</strong> (принимает значение от 0 до 100).<br />
Мы разобрались с инструментарием для изменения прозрачности, далее надо подумать как сделать смену одного изображения другим. Для этого нам надо через определенный промежуток времени запускать механизм плавного изменения свойств <strong>opacity</strong> и <strong>filter: alpha(opacity)</strong> для одного изображения в сторону уменьшения, для другого же в сторону увеличения. Для этого будет использоваться JavaScript-функция <a href="https://developer.mozilla.org/En/Window.setInterval" target=_blank>setInterval();</a>. Само же плавное изменение уровня прозрачности мы будем делать пошагово пересчитывая значение соответствующих CSS3-свойств, задавая задержку между шагами при помощи JavaScript-функции <a href="https://developer.mozilla.org/en/DOM/window.setTimeout" target=_blank>setTimeout();</a><br />
Процесс работы скрипта будет выглядеть примерно так:<br />
Имеем три изображения, наложенных одно на другое. Но два из них с минимальным значением прозрачности, и таким образом отображается только одно изображение.<br />
Одновременно изменяя в сторону уменьшения значения прозрачности первого изображения мы увеличиваем значение прозрачности второго.<br />
То же самое повторяем с изображением 2 и 3, потом между 3 и 1, и так далее по кругу.<br />
Вот примерно таким образом должно всё происходить. </p>
<p><strong>Ну и наконец сам листинг скрипта: </strong></p>
<blockquote><p>&lt;script language=JavaScript&gt;<br />
var total_pics_num = 3;&nbsp; // колличество изображений<br />
var interval = 4000;&nbsp;&nbsp;&nbsp;&nbsp; // интервал между изображениями<br />
var time_out = 10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // задержка кадров</p>
<p>var i = 0;<br />
var timeout;<br />
var opacity = 100;</p>
<p>function fade_to_next()<br />
&nbsp;{<br />
&nbsp; opacity&#8211;;<br />
&nbsp; var k = i + 1;<br />
&nbsp; var image_now = &#8216;image_&#8217; + i;<br />
&nbsp; if (i == total_pics_num)<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp; &nbsp;k = 1;<br />
&nbsp;&nbsp; }<br />
&nbsp; var image_next = &#8216;image_&#8217; + k;<br />
&nbsp; document.getElementById(image_now).style.opacity = opacity/100;<br />
&nbsp; document.getElementById(image_now).style.filter = &#8216;alpha(opacity=&#8217;+ opacity +&#8217;)';<br />
&nbsp; document.getElementById(image_next).style.opacity = (100-opacity)/100;<br />
&nbsp; document.getElementById(image_next).style.filter = &#8216;alpha(opacity=&#8217;+ (100-opacity) +&#8217;)';</P><P><br />
&nbsp; timeout = setTimeout(&laquo;fade_to_next()&raquo;,time_out);<br />
&nbsp; if (opacity==1)<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; opacity = 100;<br />
&nbsp;&nbsp;&nbsp; clearTimeout(timeout);<br />
&nbsp;&nbsp; }<br />
&nbsp;}</p>
<p>setInterval(function () {<br />
&nbsp;&nbsp;  i++;<br />
&nbsp;&nbsp;  if (i > total_pics_num) i=1;<br />
&nbsp;&nbsp;  fade_to_next();<br />
&nbsp; },interval);</p>
<p>&lt;/script&gt;</p>
<p>&lt;img src=&#8217;1.jpg&#8217; id=&raquo;image_1&#8243; style=&raquo;position: absolute;&raquo;&gt;<br />
&lt;img src=&#8217;2.jpg&#8217; id=&raquo;image_2&#8243; style=&raquo;opacity: 0; filter: alpha(opacity=0); position: absolute;&raquo;&gt;<br />
&lt;img src=&#8217;3.jpg&#8217; id=&raquo;image_3&#8243; style=&raquo;opacity: 0; filter: alpha(opacity=0); position: absolute;&raquo;&gt;
</p></blockquote>
<p><strong>Как это работает можно посмотреть тут:</strong><br />
<a href="http://tutorials.xyz.net.ua/css_javascript_opacity/" target=_blank>http://tutorials.xyz.net.ua/css_javascript_opacity/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xyz.net.ua/2009/05/06/css3_javascript_opacity/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Основы работы с сессиями</title>
		<link>http://blog.xyz.net.ua/2009/05/06/php_sessions/</link>
		<comments>http://blog.xyz.net.ua/2009/05/06/php_sessions/#comments</comments>
		<pubDate>Wed, 06 May 2009 14:08:04 +0000</pubDate>
		<dc:creator>Петька Сокольников</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.xyz.net.ua/?p=16</guid>
		<description><![CDATA[Эта статья была написанна мной несколько лет назад. Была опубликованна на разных сайтах: http://www.php.com.ua/ru/articles/basic/session_start.htm http://btl-studio.com/o/17/ http://kiev.abcname.net/index.php?o=17 Ну и чтобы добро не пропадало, сделаю кросспост тут. Что такое сессии и для чего они нужны? Давайте представим такую ситуацию: у вас есть некоторое количество страниц, вход на которые вы хотите ограничить паролем. У нас есть форма, в [...]]]></description>
			<content:encoded><![CDATA[<p>Эта статья была написанна мной несколько лет назад.  Была опубликованна на разных сайтах:<br />
<a href="http://www.php.com.ua/ru/articles/basic/session_start.htm" target=_blank>http://www.php.com.ua/ru/articles/basic/session_start.htm</a><br />
<a href="http://btl-studio.com/o/17/" target=_blank>http://btl-studio.com/o/17/</a><br />
<a href="http://kiev.abcname.net/index.php?o=17" target=_blank>http://kiev.abcname.net/index.php?o=17</a><br />
Ну и чтобы добро не пропадало, сделаю кросспост тут.</p>
<p><span id="more-16"></span><br />
<strong>Что такое сессии и для чего они нужны?</strong></p>
<p>Давайте представим такую ситуацию: у вас есть некоторое количество страниц, вход на которые вы хотите ограничить паролем. У нас есть форма, в которой мы вводим логин и пароль, на следующей странице мы проверяем эти данные на «правильность», если логин и пароль верны, то отображаем содержимое страницы.</p>
<p>Всё бы ничего, но «запароленых» страниц у нас несколько, и логин с паролем надо проверять на каждой. Тут возникает необходимость передачи этих данных между страницами. Конечно, можно было бы передавать логин и пароль методом GET (http://www.domain.org/page.php?login=xyz&#038;pass=1123), но по нескольким причинам так делать не стоит (всем виден пароль). А представим себе случай, когда необходимо передать от скрипта скрипту (от страницы к странице) большое количество информации&#8230; И тут возникает мысль: «хорошо было бы иметь возможность передавать нужные нам данные от одного скрипта к другому при просмотре сайта без прямой передачи этих данных от сервера к браузеру и обратно». Таким образом, мы сами подобрались к принципу работы сессий.</p>
<p><strong><br />
Как устроенны сессии ?</strong></p>
<p>Сессии &#8211; это механизм, созданный для временного хранения и передачи информации между скриптами в пределах одного сайта.</p>
<blockquote><p>Сессии предусматривают возможность создания собственных способов обработки информации, поэтому, в принципе, можно использовать сессии и при работе с несколькими сайтами или даже с несколькими серверами. Эти способы нами здесь рассматриваться не будут, так как эти приемы выходят за рамки стандартного программирования на РНР и требуют от программиста глубоких знаний не только РНР, но и знания сетевых протоколов, архитектуры построения серверов и так далее.</p></blockquote>
<p><strong>Сессии с точки зрения программиста</strong><br />
Чтобы запустить механизм сессии в скрипте (создать сессию) необходимо воспользоваться функцией <strong>session_start()</strong>. Эта функция должна стоять в Вашем скрипте до того, как скрипт начнет вывод информации (зачем &#8211; объясним ниже). После создании сессии мы получаем доступ к суперглобальному массиву <strong>$_SESSION</strong>, который обладает полезными свойствами. Так, помещенная в него информация будет доступна нам в любом скрипте в любой функции данного сайта в течении сеанса работы с сайтом. Сеанс прекращается когда пользователь закроет браузер или по прошествии определенного времени, в течении которого пользователь не совершал переходов по сайту. Это время определяется опцией <strong>session.gc_maxlifetime</strong> в файле <strong>php.ini</strong> и определяет время, по прошествии которого файл сессии будет рассматриваться как устаревший.</p>
<p>Существует также массив <strong>$HTTP_SESSION_VARS</strong>, которым можно пользоваться при работе с сессиями. Но этот массив не является суперглобальным, плюс имя его содержит больше букв, а значит нужно потратить больше времени на его написание. В общем, пользоваться этим массивом я не рекомендую.</p>
<p><strong>Более пристальный взгляд на механизм работы сессий</strong><br />
Передача данных от скрипта к скрипту согласно механизму работы сессий состоит из создания файла, записи данных в файл, открытии файла чтении данных и тд. Итак, изначально этот механизм опирается на файлы. Как уже упоминалось, при необходимости, данные сессии можно хранить в базе данных или просто в памяти. Для этого необходимо воспользоваться функцией <strong>session_set_save_handler()</strong> и/или опцией <strong>session.save_handler</strong> в файле <strong>php.ini</strong></p>
<p><strong>Идентификатор сессии.</strong><br />
При старте сессии создается специальный файл, в котором хранятся данные, переданные с помощью сессии. Для идентификации конкретной сессии конкретного пользователя используется так называемый идентификатор сессии. Идентификатор представляет из себя 128 битное число типа 523afa15f4a8e05e95241481c0cbc71e, которое при старте сессий выбирается случайным образом. В итоге, мы имеем файл, в имени которого присутствует уникальный идентификатор равный идентификатору сессии.</p>
<p><strong>Передача идентификатора сессии</strong><br />
Существует два способа передачи идентификатора сессии между сервером и браузером:</p>
<ul>
<li>Куки</li>
<li>Как параметр в URL</li>
</ul>
<p><strong>Использование cookies</strong> – если у пользователи куки включены PHP процессор сам помещает туда переменную со значением идентификатора, и в нужный момент читает ее от туда, причем включены у клиента куки или нет – php определяет самостоятельно.</p>
<blockquote><p><strong>Что такое cookie?</strong><br />
    Cookie это небольшая порция информации, которую сервер передает клиенту. Клиент (броузер) будет хранить эту информацию и передавать ее серверу с каждым запросом как часть HTTP заголовка. Некоторые cookie хранятся только в течение одной сессии, они удаляются после закрытия броузера. Другие, установленные на некоторый период времени, данные записываются в файл.</p></blockquote>
<p><strong>Использование параметров</strong> – этот метод используется PHP если куки отключены. Суть метода в том, что PHP процессор анализирует весь код, предназначенный для отображения в браузере, и производит автозамену всех ссылок таким образом, чтобы идентификатор сессии мог передаться на следующую страницу посредством метода GET или POST.</p>
<p><strong><br />
Примеры автозамены:</strong></p>
<p><strong>Код до обработки php-процессором:</strong><br />
<code>&lt;a href=page.php&gt;link&lt;/a&gt;<br />
</code></p>
<p><strong>Код после обработки php-процессором:</strong><br />
<code>&lt;a href=page.php?PHPSESSID=523afa15f4a8e05e95241481c0cbc71e&gt;link&lt;/a&gt;</code></p>
<p><strong>Код до обработки формы php-процессором:</strong><br />
<code>&lt;form action=page.php&gt;<br />
&lt;/form&gt;</code></p>
<p><strong>Код после обработки формы php-процессором:</strong><br />
<code>&lt;form action=page.php&gt;<br />
&lt;input type="hidden" name="PHPSESSID" value="523afa15f4a8e05e95241481c0cbc71e"&gt;<br />
&lt;/form&gt;<br />
</code></p>
<p><strong>Выводы</strong></p>
<p>Итак, подведем итог сказанному выше. У нас есть данные, которые необходимо использовать на нескольких страницах; для каждого клиента под хранение этих данных выделяется пространство памяти с уникальным идентификатором; PHP передает этот идентификатор от скрипта к скрипту, тем самым, открывая доступ к выделенному для текущего клиента участку памяти. Все эти действия выполняются PHP-процессором автоматически, а от программиста требуется всего лишь дать команду на запуск сессий.<br />
На примере всего этого мы видим, что сессии – это очень удобный и гибкий механизм для идентификации клиентских запросов.</p>
<p><strong>Часто используемые параметры и функции для сессий</strong></p>
<p><strong>session_start(); </strong>- запускает механизм сессий для текущего скрипта.</p>
<blockquote><p>    <strong>Предупреждение:</strong><br />
    Если Вы хотите, чтобы ваш сценарий работал независимо от register_globals, Вам нужно использовать массив <strong>$_SESSION</strong> так как данные которые находятся в этом массиве автоматически регистрируются. Если ваш сценарий использует <strong>session_register()</strong>, он не будет работать в средах где директива PHP <strong>register_globals</strong> выключена.</p></blockquote>
<p><strong><br />
Рекомендуется использовать такую конструкцию для регистрации переменных в сесии</strong><br />
<code>$_SESSION[‘name’]=”Василий”;</code></p>
<p><strong>session_destroy();</strong> &#8211; уничтожаются данные, хранящиеся в сессии, сам файл сессии и его идентификатор.</p>
<p><strong>session_name();</strong> &#8211; эта функция возвращает название переменной, которая используется для хранения идентификатора сессии.</p>
<p><strong>session_id();</strong> &#8211; сам идентификатор сессии.</p>
<p><strong>session.name</strong> – параметр в php.ini устанавливающий имя переменной для хранения идентификатора сессии, по умолчанию значение – PHPSESSID.</p>
<p><strong>session.auto_start</strong> – параметр включающий/выключающий автоматический старт сессий. Если значение этого параметра – <strong>1</strong>, то сессии стартуют автоматически и использовать <strong>session_start()</strong> не надо, если значение параметра – <strong>0</strong>, то сессии не будут стартовать автоматически. По умолчанию значение <strong>0</strong>.</p>
<p><strong>session.use_cookies</strong> – параметр указывающий PHP процессору использовать ли куки для хранения идентификатора или нет. По умолчанию PHP-процессору разрешено использовать cookies для хранения идентификатора сессии, и значение этого параметра равно <strong>1</strong>.</p>
<p>Остальные параметры и функции для работы с сессиями используются сравнительно редко, и поэтому я не стану приводить их описание в этой статье. Но если у вас всё-таки есть желание, то вы всегда можете ознакомиться с ними тут: <a href="http://ua.php.net/manual/ru/ref.session.php" target=_blank>http://ua.php.net/manual/ru/ref.session.php</a></p>
<p><strong>Пример использования сессий</strong></p>
<p>Сейчас я на простейшем примере продемонстрирую как хранятся и передаются данные при помощи механизма сессий.</p>
<p><strong>index.php</strong><br />
<code>&lt;form action=page1.php method=”GET”&gt;<br />
Введите ваше имя &lt;input type=text name=login&gt;<br />
&lt;input type=submit&gt;<br />
&lt;/form&gt;</code></p>
<p><strong>page1.php</strong><br />
<code>&lt;?php // внимание!!! До &lt;?php не должно быть пробелов или пустых строк<br />
session_start();<br />
// включаем поддержку сессий и генерируем случайный<br />
// идентификатор сессии</P><P>$_SESSION[‘login’]=”root”;<br />
// регистрируем переменную $login как переменную сессии.</P><P>print "На предыдущей странице вы ввели имя &lt;b&gt;$_GET[‘login’]&lt;/b&gt;. Ваше имя уже хранится в файле сессии.&lt;br /&gt;<br />
Перейдите по ссылке на следующую страницу&lt;p&gt;</P><P>&lt;a href=”page2.php”&gt;Ссылка на следующую страницу&lt;/a&gt;";<br />
// делаем ссылку для перехода на следующую страницу<br />
// в эту ссылку при помощи механизма автозамены<br />
// будет подставлен идентификатор сессии<br />
?&gt;<br />
</code></p>
<p><strong>page2.php</strong><br />
<code>&lt;?php // внимание!!! До &lt;?php не должно быть пробелов или пустых строк<br />
session_start();<br />
// снова включаем поддержку сессий</P><P>print "Ваше имя, переданное при помощи механизма сессий: &lt;b&gt;$_SESSION[‘login’]&lt;/b&gt;";<br />
// выводим содержимое переменной $login<br />
// которая хранится в файле сессий<br />
?&gt;<br />
</code></p>
<p>На этом я заканчиваю свою статью, и желаю вам успехов в дальнейшем изучении PHP!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xyz.net.ua/2009/05/06/php_sessions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
