Храним сессии в MongoDB
Доброго времени суток.
Находясь под огромным впечатлением от MongoDB, о которой уже немало сказано слов, решил написать полезную статейку.
Понимаю, что если и хранить сессии в отличии от файлов, так это в memcache, который так положительно себя зарекомендовал. Но все же, эксперимента ради, сделаемпо своему.
Не буду уже говорить об установке, настройке самого mongoDB, выросли уже.
Приступаем сразу к разработке.
Для начала напишем класс, назовем его допустим «SessionMongoDB».
Положив его к библам.
А теперь создадимстраничку и попробуем использовать сессии.
Вот и все. Запускаем код, проверяем записи в монго.
Конечно же, это неидеальный код, но он рабочий.
Каждый может сделать по-своему. Начиная использованием просто функции вместо класса или не создавать объект, а использовать статистические методы класса и заканчивая использованием MongoGridFS. Каждому свое.
Спасибо за внимание.
Находясь под огромным впечатлением от MongoDB, о которой уже немало сказано слов, решил написать полезную статейку.
Понимаю, что если и хранить сессии в отличии от файлов, так это в memcache, который так положительно себя зарекомендовал. Но все же, эксперимента ради, сделаем
Не буду уже говорить об установке, настройке самого mongoDB, выросли уже.
Приступаем сразу к разработке.
Для начала напишем класс, назовем его допустим «SessionMongoDB».
<blockquote><ol>
<li> </li>
<li><font color="#000000"><?php</font></li>
<li> </li>
<li><font color="#000000">class</font> SessionMongoDB</li>
<li> <font color="#009900">{</font></li>
<li> <font color="#000000">private</font> <font color="#000088">$_collection</font><font color="#339933">;</font></li>
<li> </li>
<li> <font color="#000000">public</font> <font color="#000000">function</font> __construct<font color="#009900">(</font>MongoCollection <font color="#000088">$collection</font><font color="#009900">)</font></li>
<li> <font color="#009900">{</font></li>
<li> <font color="#000088">$this</font><font color="#339933">-></font>_collection <font color="#339933">=</font> <font color="#000088">$collection</font><font color="#339933">;</font></li>
<li> <font color="#990000">session_set_save_handler</font></li>
<li> <font color="#009900">(</font></li>
<li> <font color="#990000">array</font><font color="#009900">(</font><font color="#000088">$this</font><font color="#339933">,</font> <font color="#0000ff">'open'</font><font color="#009900">)</font><font color="#339933">,</font></li>
<li> <font color="#990000">array</font><font color="#009900">(</font><font color="#000088">$this</font><font color="#339933">,</font> <font color="#0000ff">'close'</font><font color="#009900">)</font><font color="#339933">,</font></li>
<li> <font color="#990000">array</font><font color="#009900">(</font><font color="#000088">$this</font><font color="#339933">,</font> <font color="#0000ff">'read'</font><font color="#009900">)</font><font color="#339933">,</font></li>
<li> <font color="#990000">array</font><font color="#009900">(</font><font color="#000088">$this</font><font color="#339933">,</font> <font color="#0000ff">'write'</font><font color="#009900">)</font><font color="#339933">,</font></li>
<li> <font color="#990000">array</font><font color="#009900">(</font><font color="#000088">$this</font><font color="#339933">,</font> <font color="#0000ff">'destroy'</font><font color="#009900">)</font><font color="#339933">,</font></li>
<li> <font color="#990000">array</font><font color="#009900">(</font><font color="#000088">$this</font><font color="#339933">,</font> <font color="#0000ff">'gc'</font><font color="#009900">)</font></li>
<li> <font color="#009900">)</font><font color="#339933">;</font></li>
<li> <font color="#b1b100">return</font> <font color="#009900">true</font><font color="#339933">;</font></li>
<li> <font color="#009900">}</font></li>
<li> </li>
<li> <font color="#000000">public</font> <font color="#000000">function</font> open<font color="#009900">(</font><font color="#000088">$save_path</font><font color="#339933">,</font> <font color="#000088">$session_name</font><font color="#009900">)</font></li>
<li> <font color="#009900">{</font></li>
<li> <font color="#b1b100">return</font><font color="#009900">(</font><font color="#009900">true</font><font color="#009900">)</font><font color="#339933">;</font></li>
<li> <font color="#009900">}</font></li>
<li> </li>
<li> <font color="#000000">public</font> <font color="#000000">function</font> close<font color="#009900">(</font><font color="#009900">)</font></li>
<li> <font color="#009900">{</font></li>
<li> <font color="#b1b100">return</font><font color="#009900">(</font><font color="#009900">true</font><font color="#009900">)</font><font color="#339933">;</font></li>
<li> <font color="#009900">}</font></li>
<li> </li>
<li> <font color="#000000">public</font> <font color="#000000">function</font> read<font color="#009900">(</font><font color="#000088">$id</font><font color="#009900">)</font></li>
<li> <font color="#009900">{</font></li>
<li> <font color="#000088">$data</font> <font color="#339933">=</font> <font color="#000088">$this</font><font color="#339933">-></font>_collection<font color="#339933">-></font><font color="#004000">findOne</font><font color="#009900">(</font><font color="#990000">array</font><font color="#009900">(</font><font color="#0000ff">'sid'</font> <font color="#339933">=></font> <font color="#000088">$id</font><font color="#009900">)</font><font color="#009900">)</font><font color="#339933">;</font></li>
<li> <font color="#b1b100">return</font> <font color="#000088">$data</font> ? <font color="#000088">$data</font><font color="#009900">[</font><font color="#0000ff">'data'</font><font color="#009900">]</font> <font color="#339933">:</font> <font color="#009900">null</font><font color="#339933">;</font></li>
<li> <font color="#009900">}</font></li>
<li> </li>
<li> <font color="#000000">public</font> <font color="#000000">function</font> write<font color="#009900">(</font><font color="#000088">$id</font><font color="#339933">,</font> <font color="#000088">$sess_data</font><font color="#009900">)</font></li>
<li> <font color="#009900">{</font></li>
<li> <font color="#000088">$data</font> <font color="#339933">=</font> <font color="#990000">array</font><font color="#009900">(</font></li>
<li> <font color="#0000ff">'sid'</font> <font color="#339933">=></font> <font color="#000088">$id</font><font color="#339933">,</font></li>
<li> <font color="#0000ff">'mtime'</font> <font color="#339933">=></font> <font color="#990000">time</font><font color="#009900">(</font><font color="#009900">)</font><font color="#339933">,</font></li>
<li> <font color="#0000ff">'data'</font> <font color="#339933">=></font> <font color="#000088">$sess_data</font><font color="#339933">,</font></li>
<li> <font color="#009900">)</font><font color="#339933">;</font></li>
<li> <font color="#000088">$this</font><font color="#339933">-></font>_collection<font color="#339933">-></font><font color="#004000">update</font><font color="#009900">(</font><font color="#990000">array</font><font color="#009900">(</font><font color="#0000ff">'sid'</font> <font color="#339933">=></font> <font color="#000088">$id</font><font color="#009900">)</font><font color="#339933">,</font> <font color="#000088">$data</font><font color="#339933">,</font> <font color="#009900">true</font><font color="#009900">)</font><font color="#339933">;</font></li>
<li> <font color="#b1b100">return</font> <font color="#009900">true</font><font color="#339933">;</font></li>
<li> <font color="#009900">}</font></li>
<li> </li>
<li> <font color="#000000">public</font> <font color="#000000">function</font> destroy<font color="#009900">(</font><font color="#000088">$id</font><font color="#009900">)</font></li>
<li> <font color="#009900">{</font></li>
<li> <font color="#000088">$this</font><font color="#339933">-></font>_collection<font color="#339933">-></font><font color="#004000">remove</font><font color="#009900">(</font><font color="#990000">array</font><font color="#009900">(</font><font color="#0000ff">'sid'</font> <font color="#339933">=></font> <font color="#000088">$id</font><font color="#009900">)</font><font color="#339933">,</font> <font color="#009900">true</font><font color="#009900">)</font><font color="#339933">;</font></li>
<li> <font color="#b1b100">return</font> <font color="#009900">true</font><font color="#339933">;</font></li>
<li> <font color="#009900">}</font></li>
<li> </li>
<li> <font color="#000000">public</font> <font color="#000000">function</font> gc<font color="#009900">(</font><font color="#000088">$maxlifetime</font><font color="#009900">)</font></li>
<li> <font color="#009900">{</font></li>
<li> <font color="#000088">$this</font><font color="#339933">-></font>_collection<font color="#339933">-></font><font color="#004000">remove</font><font color="#009900">(</font><font color="#990000">array</font><font color="#009900">(</font><font color="#0000ff">'mtime'</font> <font color="#339933">=></font> <font color="#990000">array</font><font color="#009900">(</font><font color="#0000ff">'$lt'</font> <font color="#339933">=></font> <font color="#990000">time</font><font color="#009900">(</font><font color="#009900">)</font> <font color="#339933">-</font> <font color="#000088">$maxlifetime</font><font color="#009900">)</font><font color="#009900">)</font><font color="#339933">,</font> <font color="#009900">true</font><font color="#009900">)</font><font color="#339933">;</font></li>
<li> <font color="#b1b100">return</font> <font color="#009900">true</font><font color="#339933">;</font></li>
<li> <font color="#009900">}</font></li>
<li> </li>
<li> <font color="#009900">}</font></li>
<li> </li>
<li><font color="#000000">?></font></li>
</ol></blockquote>
Положив его к библам.
А теперь создадим
<blockquote><ol>
<li> </li>
<li><font color="#000000"><?php</font></li>
<li> </li>
<li><font color="#666666">// Подключаем библу сессий.</font></li>
<li><font color="#b1b100">require_once</font> <font color="#0000ff">'lib'</font><font color="#339933">.</font><font color="#009900">DIRECTORY_SEPARATOR</font><font color="#339933">.</font><font color="#0000ff">'SessionMongoDB.php'</font><font color="#339933">;</font></li>
<li> </li>
<li><font color="#666666">// Соединение с монгоДБ</font></li>
<li><font color="#000088">$m</font> <font color="#339933">=</font> <font color="#000000">new</font> Mongo<font color="#009900">(</font><font color="#009900">)</font><font color="#339933">;</font></li>
<li> </li>
<li><font color="#666666">// Выбираем базу данных и коллекцию.</font></li>
<li><font color="#000088">$collection</font> <font color="#339933">=</font> <font color="#000088">$m</font><font color="#339933">-></font><font color="#004000">selectCollection</font><font color="#009900">(</font><font color="#0000ff">'db'</font><font color="#339933">,</font> <font color="#0000ff">'sessions'</font><font color="#009900">)</font><font color="#339933">;</font></li>
<li> </li>
<li><font color="#666666">// Создаем объект</font></li>
<li><font color="#000000">new</font> SessionMongoDB<font color="#009900">(</font><font color="#000088">$collection</font><font color="#009900">)</font><font color="#339933">;</font></li>
<li> </li>
<li><font color="#666666">/*</font></li>
<li><font color="#666666"> * Дальше работаем как обычно</font></li>
<li><font color="#666666"> */</font></li>
<li><font color="#990000">session_start</font><font color="#009900">(</font><font color="#009900">)</font><font color="#339933">;</font></li>
<li> </li>
<li><font color="#b1b100">if</font><font color="#009900">(</font><font color="#990000">empty</font><font color="#009900">(</font><font color="#000088">$_SESSION</font><font color="#009900">)</font><font color="#009900">)</font></li>
<li> <font color="#009900">{</font></li>
<li> <font color="#000088">$_SESSION</font><font color="#009900">[</font><font color="#0000ff">'login'</font><font color="#009900">]</font> <font color="#339933">=</font> <font color="#0000ff">'admin'</font><font color="#339933">;</font></li>
<li> <font color="#000088">$_SESSION</font><font color="#009900">[</font><font color="#0000ff">'password'</font><font color="#009900">]</font> <font color="#339933">=</font> <font color="#990000">md5</font><font color="#009900">(</font><font color="#0000ff">'admin'</font><font color="#009900">)</font><font color="#339933">;</font></li>
<li> <font color="#009900">}</font></li>
<li> </li>
<li><font color="#b1b100">echo</font> <font color="#0000ff">'<pre>'</font><font color="#339933">;</font></li><li><font color="#990000">print_r</font><font color="#009900">(</font><font color="#000088">$_SESSION</font><font color="#009900">)</font><font color="#339933">;</font></li><li><font color="#b1b100">echo</font> <font color="#0000ff">'</pre>'</font><font color="#339933">;</font></li>
<li><font color="#000000">?></font></li>
</ol></blockquote>
Вот и все. Запускаем код, проверяем записи в монго.
Конечно же, это неидеальный код, но он рабочий.
Каждый может сделать по-своему. Начиная использованием просто функции вместо класса или не создавать объект, а использовать статистические методы класса и заканчивая использованием MongoGridFS. Каждому свое.
Спасибо за внимание.
0 комментариев