Advertisement
  1. Code
  2. CodeIgniter

Работаем с данными сессии в CodeIgniter

Scroll to top
Read Time: 10 min

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, а обсуждение драйверов сеансов завершило нашу статью.

Как обычно, вы можете оставлять свои вопросы и предложения, используя канал ниже!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.