﻿
<h1 class=p1>Сессии (сеансы) в PHP</h1>
<table border="0" cellspacing="10">
    <tr valign="top">
        <td>
            <a class=bluelink href="#1" title="Открытие сессии" >session_start()</a>&nbsp;<br>
            <a class=bluelink href="#4" title="Разрегистрация переменных">unset()</a>&nbsp;<br>
        </td>
        <td>
            <a class=bluelink href="#2" title="Регистрация переменных сессии" >session_register()</a>&nbsp;<br>
            <a class=bluelink href="#3" title="Закрытие сессии">session_destroy()</a>&nbsp;<br>     
        </td>
        <td>        
            <a class=bluelink href="#4" title="Разрегистрация переменных">session_unregister()</a>&nbsp;<br>                    
        </td>
    </tr>
</table>
<br>
<br>

<p class=text>Сессии и cookies предназначены для хранения сведений о пользователях при переходах между несколькими страницами. При использовании сессий данные сохраняются во временных файлах на сервере. Файлы с cookies хранятся на компьютере пользователя, и по запросу отсылаются броузером серверу.</p>
<p class=text>Использование сессий и cookies очень удобно и оправдано в таких приложениях как Интернет-магазины, форумы, доски объявлений, когда, во-первых, необходимо сохранять информацию о пользователях на протяжении нескольких станиц, а, во-вторых, своевременно предоставлять пользователю новую информацию.</p>
<p class=text>Протокол HTTP является протоколом "без сохранения состояния". Это означает, что данный протокол не имеет встроенного способа сохранения состояния между двумя транзакциями. Т. е., когда пользователь открывает сначала одну страницу сайта, а затем переходит на другую страницу этого же сайта, то основываясь только на средствах, предоставляемых протоколом HTTP невозможно установить, что оба запроса относятся к одному пользователю. Т. о. необходим метод, при помощи которого было бы отслеживать информацию о пользователе в течение одного сеанса связи с Web-сайтов. Одним из таких методов является управление сеансами при помощи предназначенных для этого функций. Для нас важно то, что сеанс по сути, представляет собой группу переменных, которые, в отличие от обычных переменных, сохраняются и после завершения выполнения PHP-сценария.</p>
<p class=text>При работе с сессиями различают следующие этапы:</p>
<ul>
  <li>открытие сессии</li>
  <li>регистрация переменных сессии и их использование</li>
  <li>закрытие сессии</li>
</ul>
<a name=1></a>
<h2 class=p1>Открытие сессии</h2>
<p class=text>Самый простой способ открытия сессии заключается в использовании функции <b>session_start</b>, которая вызывается в начале PHP-сценария:</p>
<h1 class=p1>session_start</h1>
<p class=prim><b><i>Синтаксис:</i></b></p>
<blockquote><pre>
  <b>session_start</b><em class=gr>();</em>
</pre></blockquote>
<p class=text>Эта функция проверяет, существует ли идентификатор сессии, и, если нет, то создает его. Если идентификатор текущей сессии уже существует, то загружаются зарегистрированные переменные сессии.</p>
<a name=2></a>
<h2 class=p1>Регистрация переменных сессии</h2>
<p class=text>Вообще говоря, регистрация переменных сессии осуществляется при помощи функции <b>session_register</b>:</p>
<h1 class=p1>session_register</h1>
<p class=prim><b><i>Синтаксис:</i></b></p>
<blockquote><pre>
  <em class=gr>bool</em> <b>session_register</b><em class=gr>(</em><b>mixed name</b> [,<b>mixed...</b>]<em class=gr>);</em>
</pre></blockquote>
<p class=text>Т.е. для того, чтобы зарегистрировать переменную, в которой хранится имя пользователя, указанное им при регистрации, мы должны вызвать эту функцию следующим образом:</p>
<blockquote><pre>
  <b>session_register</b><em class=gr>(</em>"username"<em class=gr>);</em>
</pre></blockquote>
<p class=text>К примеру:</p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <b>$name</b><em class=gr> =</em> "maksim"<em class=gr>;</em>
  <b>$maksim</b><em class=gr> =</em> "my_name"<em class=gr>;</em>
  <b>session_register</b><em class=gr>(</em><b>$name</b><em class=gr>)</em> //<em class=comnt> регистрируется переменная "maksim" со </em>
                          // <em class=comnt>значением "my_name"</em>
<em class=red>?&gt;</em>
</pre></blockquote>
<p class=text>Однако, начиная с версии PHP 4.2.0, практика регистрирования сеансовых переменных претерпела некоторые изменения, что вносит в этот вопрос некоторую путаницу. Дело в том, что функция <b>session_register</b> применима только к глобальным переменным и требует, чтобы параметр <b>register_globals</b> был включен. Начиная с этой же версии языка, сеансовые переменные всегда регистрируются в ассоциативных массивах <b>$HTTP_SESSION_VARS</b> и <b>$_SESSION</b>. Т.о., аналогом вызова функции <b>session_register</b>("username") при включенном <b>register_globals</b> являются следующие выражения:</p>
<blockquote><pre>
  <b>$_SESSION</b><em class=gr>[</em>'username'<em class=gr>] =</em> "username"<em class=gr>;</em>
  //<em class=comnt> или</em>
  <b>$HTTP_SESSION_VARS</b><em class=gr>[</em>'username'<em class=gr>] = </em>"username"<em class=gr>;</em>
</pre></blockquote>
<p class=text>Такой подход является более оправданным, поскольку функция <b>session_register</b> в действительности делает то же самое - помещает значение переменной сессии в специальный массив для хранения зарегистрированных переменных сессии. Таким образом:</p>
<ul>
  <li>если вы используете функцию <b>session_register</b>, то должен быть включен параметр <b>register_globals</b></li>
  <li>при отключенном <b>register_globals</b> инициализация сеансовых переменных происходит путем присваивания значений элементам ассоциативных массивов</li>
</ul>
<p class=text>Для корректной работы приложения необходимо проверять, установлены ли переменные сессии. Такую проверку можно сделать при помощи функции <b>session_is_registered</b>:</p>
<blockquote><pre>
  <b>$result</b><em class=gr> = </em><b>session_is_registerd</b><em class=gr>(</em>"username"<em class=gr>);</em>
</pre></blockquote>
<p class=text>При использовании ассоциативных массивов <b>$HTTP_SESSION_VARS</b> и <b>$_SESSION</b> применять эту функцию не следует, а нужно напрямую проверять элементы этих массивов, к примеру, так:</p>
<blockquote><pre>
  <b>if</b><em class=gr>(</em><b>isset</b><em class=gr>(</em><b>$_SESSION</b>['username']<em class=gr>))</em>
</pre></blockquote>
<a name=3></a>
<h2 class=p1>Закрытие сессии</h2>
<p class=text>После завершения работы с сессией сначала нужно разрегистрировать все переменные сессии, а затем вызвать функцию <b>session_destroy</b>:</p>
<h1 class=p1>session_destroy</h1>
<p class=prim><b><i>Синтаксис:</i></b></p>
<blockquote><pre>
  <b>session_destroy</b><em class=gr>();</em>
</pre></blockquote>
<a name=4></a>
<p class=text>Способы разрегистрации сеансовых переменных различаются в зависимости от того, каким способом они были зарегистрированы.</p>
<p class=text>При включенном <b>register_globals</b> и использовании функции <b>session_register</b> разрегистрация осуществляется при помощи функции <b>session_unregister</b>:</p>
<h1 class=p1>session_unregister</h1>
<p class=prim><b><i>Синтаксис:</i></b></p>
<blockquote><pre>
  <b>session_unregister</b><em class=gr>(</em>"username"<em class=gr>);</em>
</pre></blockquote>
<p class=text>Если же регистрация осуществлялась путем с применением ассоциативных массивов, то поступают следующим образом:</p>
<h1 class=p1>unset</h1>
<p class=prim><b><i>Синтаксис:</i></b></p>
<blockquote><pre>
  <b>unset</b><em class=gr>(</em><b>$_SESSION</b>["username"]<em class=gr>);</em>
</pre></blockquote>
<h2 class=p1>Пример простой сессии</h2>
<p class=text>Рассмотрим пример простой сессии, работающей с тремя страницами. При посещении пользователем первой страницы открывается сессия и регистрируется переменная <b>$username</b>. Соответствующий код реализации приведен в листинге:</p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <b>session_start</b><em class=gr>();</em>
  <b>$_SESSION</b>['username']<em class=gr> = </em>"maksim"<em class=gr>;
  echo</em> 'Привет, '<b>.$_SESSION</b>['username']."&lt;br&gt;";
<em class=red>?&gt;</em>
  &lt;a href="page2.php"&gt;На следующую страницу &lt;/a&gt;
</pre></blockquote>
<p class=text>Результат работы этого сценария показан на рис:</p>
<img src="vk/images/1.jpg" tppabs="http://site/bookphp/vk/images/1.jpg">
<p class=text>После этого, пользователь maksim нажимает на ссылку и попадает на страницу page2.php, код которой приведен в листинге:</p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <b>session_start</b><em class=gr>();
  echo</em> <b>$_SESSION</b>['username'].' , ты пришел на другую страницу этого сайта!'<em class=gr>;
  echo(</em>"&lt;br&gt;"<em class=gr>);</em>
<em class=red>?&gt;</em>
  &lt;a href="page3.php"&gt;На следующую страницу &lt;/a&gt;
</pre></blockquote>
<p class=text>Результат работы этого скрипта показан на рис:</p>
<img src="vk/images/2.jpg" tppabs="http://site/bookphp/vk/images/2.jpg">
<p class=text>При нажатии на ссылку, пользователь попадает на страницу page3.php, при этом происходит разрегистрация сеансовой переменной и уничтожение сессии. Соответствующий код реализации приведен в листинге:</p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <b>session_start</b><em class=gr>();</em>
  <b>unset</b><em class=gr>(</em><b>$_SESSION</b>['username']<em class=gr>);</em> // <em class=comnt>разрегистрировали переменную</em>
  <em class=gr>echo</em> 'Привет, '<b>.$_SESSION</b>['username']<em class=gr>;</em>
  <em class=comnt>/* теперь имя пользователя уже не выводится */</em>
  <b>session_destroy</b><em class=gr>();</em> // <em class=comnt>разрушаем сессию</em>
<em class=red>?&gt;</em>
</pre></blockquote>
<p class=text>Как видно из рисунка, после разрегистрации сеансовой переменной значение массива <b>$_SESSION</b>['username'] уже недоступно:</p>
<img src="vk/images/3.jpg" tppabs="http://site/bookphp/vk/images/3.jpg">
