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