Работаем с данными сессии в CodeIgniter
Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)
Как разработчику CodeIgniter, вам действительно важно понять, как работать с основной библиотекой сессий. Конечно, вы всегда можете использовать синтаксис $_SESSION
по умолчанию, но вместо этого всегда рекомендуется использовать оболочку.
Начнем с того, что загрузим библиотеку для работы с сессий, затем перейдем к обсуждению того, как добавлять, извлекать, удалять и уничтожать переменные сессии. В последнем сегменте статьи мы рассмотрим различные встроенные драйверы сессий, имеющиеся в вашем распоряжении и предоставляемые фреймворком CodeIgniter.
Загрузка библиотеки для работы с сессией
Если вы хотите работать с сессиями в CodeIgniter, первое, что вам нужно, - это встроенная библиотека сессий. Если вы конечно не разработаете веб-приложение, которое вообще не требует сеансов, то вам не нужно беспокоиться о подобной библиотеке. Хотя это не так в большинстве случаев, вы можете автоматически загружать библиотеку сессий в CodeIgniter, чтобы она включала функции обработки сессии для каждого веб-запроса.
Идем дальше и откроем файл, расположенный в application/config/autoload.php
. Найдите следующий раздел.
1 |
/*
|
2 |
| -------------------------------------------------------------------
|
3 |
| Auto-load Libraries
|
4 |
| -------------------------------------------------------------------
|
5 |
| These are the classes located in system/libraries/ or your
|
6 |
| application/libraries/ directory, with the addition of the
|
7 |
| 'database' library, which is somewhat of a special case.
|
8 |
|
|
9 |
| Prototype:
|
10 |
|
|
11 |
| $autoload['libraries'] = array('database', 'email', 'session');
|
12 |
|
|
13 |
| You can also supply an alternative library name to be assigned
|
14 |
| in the controller:
|
15 |
|
|
16 |
| $autoload['libraries'] = array('user_agent' => 'ua');
|
17 |
*/
|
18 |
$autoload['libraries'] = array(); |
Массив $autoload ['libraries']
содержит список библиотек, которые будут загружены автоматически. В соответствии с нашим требованием изменим его так:
1 |
$autoload['libraries'] = array('session'); |
Кроме того, есть другой способ, которым вы могли бы достичь того же результата. Вы можете использовать следующий код в файле контроллера для загрузки библиотеки сесссий.
1 |
$this->load->library('session'); |
Это в значительной степени касается инициализации библиотеки сеансов.
В следующих параграфах мы рассмотрим различные операции, которые вы можете выполнять с основной библиотекой сеансов. Чтобы продемонстрировать это, мы будем использовать пример файла контроллера, который загружает библиотеку сеансов и предоставляет методы, которые будут обсуждаться в этой статье.
Двигаемся дальше и создадим файл application/controllers/Example.php
со следующим содержимым.
1 |
<?php
|
2 |
defined('BASEPATH') OR exit('No direct script access allowed'); |
3 |
|
4 |
class Example extends CI_Controller { |
5 |
public function __construct() |
6 |
{
|
7 |
parent::__construct(); |
8 |
|
9 |
// load Session Library
|
10 |
$this->load->library('session'); |
11 |
|
12 |
// load url helper
|
13 |
$this->load->helper('url'); |
14 |
}
|
15 |
|
16 |
public function index() |
17 |
{
|
18 |
/**** SET SESSION DATA ****/
|
19 |
// set single item in session
|
20 |
$this->session->set_userdata('favourite_website', 'https://tutsplus.com'); |
21 |
|
22 |
// set array of items in session
|
23 |
$arraydata = array( |
24 |
'author_name' => 'Sajal Soni', |
25 |
'website' => 'http://code.tutsplus.com', |
26 |
'twitter_id' => '@sajalsoni', |
27 |
'interests' => array('tennis', 'travelling') |
28 |
);
|
29 |
$this->session->set_userdata($arraydata); |
30 |
|
31 |
/**** GET SESSION DATA ****/
|
32 |
// get data from session
|
33 |
echo "Favourite Website: ". $this->session->userdata('favourite_website'); |
34 |
echo "<br>"; |
35 |
echo "Author Name: ". $this->session->userdata('author_name'); |
36 |
echo "<br>"; |
37 |
echo "Interest (Array Example): " . $this->session->userdata('interests')[0]; |
38 |
echo "<br>"; |
39 |
|
40 |
// get e'thing stored in session at once
|
41 |
echo '<pre>'; |
42 |
print_r($this->session->userdata()); |
43 |
|
44 |
/**** REMOVE SESSION DATA ****/
|
45 |
// unset specific key from session
|
46 |
$this->session->unset_userdata('favourite_website'); |
47 |
|
48 |
// unset multiple items at once
|
49 |
$keys = array('twitter_id', 'interests'); |
50 |
$this->session->unset_userdata($keys); |
51 |
|
52 |
echo '<pre>'; |
53 |
print_r($this->session->userdata()); |
54 |
}
|
55 |
|
56 |
public function setflash() |
57 |
{
|
58 |
// set flash data
|
59 |
$this->session->set_flashdata('flash_welcome', 'Hey, welcome to the site!'); |
60 |
|
61 |
// mark existing data as flash data
|
62 |
$this->session->set_userdata('flash_message', 'I am flash message!'); |
63 |
$this->session->mark_as_flash('flash_message'); |
64 |
|
65 |
redirect('example/getflash'); |
66 |
}
|
67 |
|
68 |
public function getflash() |
69 |
{
|
70 |
// get flash data
|
71 |
echo "Flash welcome message: ". $this->session->flashdata('flash_welcome'); |
72 |
echo '<pre>'; |
73 |
print_r($this->session->flashdata()); |
74 |
}
|
75 |
|
76 |
public function tempdata() |
77 |
{
|
78 |
// set temp data
|
79 |
$this->session->set_tempdata('coupon_code', 'XYEceQ!', 300); |
80 |
|
81 |
// mark existing data as temp data
|
82 |
$this->session->set_userdata('coupon_code', 'XYEceQ!'); |
83 |
$this->session->mark_as_temp('coupon_code', 300); |
84 |
|
85 |
// get temp data
|
86 |
echo $this->session->tempdata('coupon_code'); |
87 |
}
|
88 |
|
89 |
public function destroy() |
90 |
{
|
91 |
$this->session->set_userdata('favourite_website', 'http://tutsplus.com'); |
92 |
|
93 |
// destory session
|
94 |
$this->session->sess_destroy(); |
95 |
}
|
96 |
}
|
Это очень простой файл контроллера, с которым вы должны быть знакомы как разработчик CodeIgniter. Теперь мы готовы перейти к следующим разделам, которые объясняют понимание концепций обработки сессий.
Как добавлять, извлекать и удалять данные сеанса
Для начала приведем код нашего метода __construct
.
1 |
public function __construct() |
2 |
{
|
3 |
parent::__construct(); |
4 |
|
5 |
// load Session Library
|
6 |
$this->load->library('session'); |
7 |
|
8 |
// load url helper
|
9 |
$this->load->helper('url'); |
10 |
}
|
На всякий случай, если вы не загрузили автоматически библиотеку для работы с сессиями, то контроллер сделает это в конструкторе. Кроме того, мы также загрузили вспомогательный url
хелпер, который позволяет нам использовать некоторые вспомогательные методы, которые мы увидим позже.
Затем, возьмите код метода index
.
1 |
public function index() |
2 |
{
|
3 |
/**** SET SESSION DATA ****/
|
4 |
// set single item in session
|
5 |
$this->session->set_userdata('favourite_website', 'http://tutsplus.com'); |
6 |
|
7 |
// set array of items in session
|
8 |
$arraydata = array( |
9 |
'author_name' => 'Sajal Soni', |
10 |
'website' => 'http://code.tutsplus.com', |
11 |
'twitter_id' => '@sajalsoni', |
12 |
'interests' => array('tennis', 'travelling') |
13 |
);
|
14 |
$this->session->set_userdata($arraydata); |
15 |
|
16 |
/**** GET SESSION DATA ****/
|
17 |
// get data from session
|
18 |
echo "Favourite Website: ". $this->session->userdata('favourite_website'); |
19 |
echo "<br>"; |
20 |
echo "Author Name: ". $this->session->userdata('author_name'); |
21 |
echo "<br>"; |
22 |
echo "Interest (Array Example): " . $this->session->userdata('interests')[0]; |
23 |
echo "<br>"; |
24 |
|
25 |
// get e'thing stored in session at once
|
26 |
echo '<pre>'; |
27 |
print_r($this->session->userdata()); |
28 |
|
29 |
/**** REMOVE SESSION DATA ****/
|
30 |
// unset specific key from session
|
31 |
$this->session->unset_userdata('favourite_website'); |
32 |
|
33 |
// unset multiple items at once
|
34 |
$keys = array('twitter_id', 'interests'); |
35 |
$this->session->unset_userdata($keys); |
36 |
|
37 |
echo '<pre>'; |
38 |
print_r($this->session->userdata()); |
39 |
}
|
Когда вы уже загрузили библиотеку для работы сессиями, вы можете использовать $this->session
для доступа к объекту сеанса и доступа к поддерживаемым методам. Метод set_userdata
используется для создания новой переменной сеанса, и обычно он принимает два аргумента - ключ и значение.
1 |
$this->session->set_userdata('favourite_website', 'http://tutsplus.com'); |
Вы также можете использовать метод set_userdata
для создания нескольких переменных в одном вызове. В этом случае вам просто нужно указать один аргумент, и это должен быть массив, как показано ниже.
1 |
// set array of items in session
|
2 |
$arraydata = array( |
3 |
'author_name' => 'Sajal Soni', |
4 |
'website' => 'http://code.tutsplus.com', |
5 |
'twitter_id' => '@sajalsoni', |
6 |
'interests' => array('tennis', 'travelling') |
7 |
);
|
8 |
$this->session->set_userdata($arraydata); |
Читатели с наметанным глазом уже заметили, что вы могли бы также установить массив как значение любой переменной сеанса, как показано выше в примере interests
.
Теперь давайте посмотрим, как получить значение любой переменной сеанса. Метод userdata
используется для получения значения любой переменной сеанса, и обычно ему нужен ключ переменной сеанса в качестве первого аргумента.
1 |
echo "Favourite Website: ". $this->session->userdata('favourite_website'); |
Если вы ищете одну из записей массива, вы можете использовать следующую конструкцию:
1 |
echo "Interest (Array Example): " . $this->session->userdata('interests')[0]; |
Чаще всего вам нужно знать, сколько переменных в общей сложности хранятся в активном сеансе для целей отладки, и вы также можете это сделать.
1 |
// get e'thing stored in session at once
|
2 |
echo '<pre>'; |
3 |
print_r($this->session->userdata()); |
Да, тот же метод userdata
приходит нам на помощь! Если вы не передадите ни какой аргумент методу userdata
, он вернет все переменные сеанса.
Наконец, давайте посмотрим, как вы можете удалить переменные из сессии. Это делает метод unset_userdata
, который можно использовать, если вы хотите удалить записи сеанса.
1 |
// unset specific key from session
|
2 |
$this->session->unset_userdata('favourite_website'); |
И вот вариант того же метода, который показывает, как удалить несколько записей за один раз.
1 |
// unset multiple items at once
|
2 |
$keys = array('twitter_id', 'interests'); |
3 |
$this->session->unset_userdata($keys); |
Этот код должен удалить записи twitter_id
и interests
из сессии.
Двигаемся дальше и протестируем метод index
, чтобы увидеть все методы в действии.
Полезные материалы: Flashdata и Tempdata
В последнем разделе мы обсудили основы обработки сессий в CodeIgniter. В этом разделе мы обсудим несколько других полезных методов, предоставляемых библиотекой сессии.
В повседневной разработке вам часто приходится отображать сообщения в ответ на определенные действия пользователя. В качестве примера вы хотите отобразить сообщение об успешном завершении, когда кто-то отправляет комментарий на ваш сайт, и сообщение должно отображаться только один раз. Метод set_flashdata
является идеальным кандидатом для такого варианта использования сессии.
Фактически, set_flashdata
очень похож на метод set_userdata
, поскольку позволяет сохранить значение в сессии. Единственное различие состоит в том, что значение сеанса, установленное методом flashdata
, доступно только для следующего запроса. В последующих запросах вам больше не удастся получить доступ к этим переменным, поскольку они будут удалены.
Возьмите код метода setflash
.
1 |
public function setflash() |
2 |
{
|
3 |
// set flash data
|
4 |
$this->session->set_flashdata('flash_welcome', 'Hey, welcome to the site!'); |
5 |
|
6 |
// mark existing data as flash data
|
7 |
$this->session->set_userdata('flash_message', 'I am flash message!'); |
8 |
$this->session->mark_as_flash('flash_message'); |
9 |
|
10 |
redirect('example/getflash'); |
11 |
}
|
Вы можете создать новую переменную flashdata
так же, как если бы вы создали регулярную переменную сеанса, используя метод set_userdata
. С другой стороны, вы также можете пометить существующую переменную сеанса как переменную flashdata
. В этом случае вам нужно использовать метод mark_as_flash
, как показано в приведенном выше коде.
Наконец, мы перенаправляем пользователя к методу getflash
, который показывает, как использовать переменные flashdata, которые были установлены в методе setflash
. Давайте быстро взглянем на метод getflash
.
1 |
public function getflash() |
2 |
{
|
3 |
// get flash data
|
4 |
echo "Flash welcome message: ". $this->session->flashdata('flash_welcome'); |
5 |
echo '<pre>'; |
6 |
print_r($this->session->flashdata()); |
7 |
}
|
Как и ожидалось, есть метод flashdata
, который позволяет выбирать переменные сеанса, хранящиеся как flashdata. Если вы вызовете метод flashdata
без каких-либо аргументов, он вернет все переменные flashdata, аналогично как делает метод userdata
.
Идем дальше и протестируем метод setflash
. Вы будете перенаправлены на URL-адрес getflash, где вы увидите сообщение. Если вы обновите страницу getflash, вы больше не увидите это сообщение!
Далее, есть еще один вариант, предоставляемый библиотекой сеансов в этой категории - переменные сеанса tempdata. Если вы хотите создать переменные сеанса за определенный период времени, метод set_tempdata
- тот, который вам нужен.
Например, если вы хотите создать переменную сеанса, которая должна автоматически удаляться по истечении определенного периода времени, вы можете использовать метод set_tempdata
для создания такой переменной, как показано в следующем методе.
1 |
public function tempdata() |
2 |
{
|
3 |
// set temp data
|
4 |
$this->session->set_tempdata('coupon_code', 'XYEceQ!', 300); |
5 |
|
6 |
// mark existing data as temp data
|
7 |
$this->session->set_userdata('coupon_code', 'XYEceQ!'); |
8 |
$this->session->mark_as_temp('coupon_code', 300); |
9 |
|
10 |
// get temp data
|
11 |
echo $this->session->tempdata('coupon_code'); |
12 |
}
|
Третий аргумент в методе set_tempdata
указывает количество секунд, после которых переменная будет удалена из сессии.
Вы также можете пометить существующую переменную сеанса как tempdata, используя метод mark_as_temp
, при условии, что вы уже создали переменную сеанса, используя метод set_userdata
.
Наконец, вы можете использовать метод tempdata
для получения значения любой переменной tempdata.
Так что хорошо иметь подобный функционал в своем распоряжении!
То, что вы не должны забывать: Session Destroy
Уничтожение сеанса, вероятно, является последним, что вы хотели бы сделать, когда пользователь выходит из системы. Это гарантирует, что установленные до этого сеансовые переменные будут удалены из активного сеанса и больше не будут доступны для последующих запросов.
Давайте введем код метода destroy
и пройдемся по нему.
1 |
public function destroy() |
2 |
{
|
3 |
$this->session->set_userdata('favourite_website', 'http://tutsplus.com'); |
4 |
|
5 |
// destroy session
|
6 |
$this->session->sess_destroy(); |
7 |
}
|
Метод sess_destroy
помогает нам удалить активный сеанс. Конечно, он также удалит переменные tempdata и flashdata, которые были установлены в активном сеансе.
Убедитесь, что вы выработали у себя привычку к удалению сеанса, как только он перестает быть полезным в контексте текущего пользователя.
Вишенка на торте: драйверы сеансов
Мы переходим к последнему разделу этой статьи - драйверы сеанса. Чаще всего вы не заботитесь о настройке драйвера сеанса в своем приложении, поскольку драйвер сеанса по умолчанию, файловая система, уже настроен.
Таким образом, файловая система содержит все данные, относящиеся к сеансу, и она широко используется и является общепринятым стандартом для обработки сеансов. Однако CodeIgniter также поддерживает и другие драйверы сеанса, которые вы можете использовать, если хотите переключиться с драйвера сеанса файловой системы по умолчанию.
Вот список всех поддерживаемых драйверов в CodeIgniter:
- Файлы
- База данных
- Redis
- Memcached
Драйвер сеанса базы данных, как следует из названия, сохраняет данные сеанса в базе данных, настроенной для вашего приложения CodeIgniter.
С другой стороны, два других драйвера сеанса являются механизмами хранения в памяти, предпочтительными для высоконагруженных веб-сайтов.
В файле application/config/config.php
вы можете настроить драйвер сеанса, который вы хотите использовать в своем приложении.
1 |
$config['sess_driver'] = 'database'; |
2 |
$config['sess_save_path'] = 'custom_sessions'; |
Он сообщает CodeIgniter использовать драйвер сеанса базы данных, так что данные сеанса будут сохранены в таблице MySQL custom_sessions
.
Обсуждение каждого драйвера сеанса выходит за рамки данной статьи, но вы можете ознакомиться с официальной документацией на сайте, которая содержит подробное руководство для каждого драйвера.
Вывод
Обработка сессий в CodeIgniter была темой сегодняшнего учебника, и мы подробно обсудили ее, рассмотрев каждый аспект предмета.
Начиная с основных операций с сессиями, мы также рассмотрели интересные методы flashdata и tempdata, а обсуждение драйверов сеансов завершило нашу статью.
Как обычно, вы можете оставлять свои вопросы и предложения, используя канал ниже!