Статьи

Как работать с данными сеанса в CodeIgniter

Как разработчику 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 чтобы увидеть вещи в действии.

В последнем разделе мы обсудили основы обработки сессий в 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, которые были установлены в активном сеансе.

Убедитесь, что вы привыкли разрушать сеанс, если он больше не используется в текущем пользовательском контексте.

Мы в последнем разделе этой статьи — драйверы сессий. Чаще всего вам не нужно настраивать драйвер сеанса в вашем приложении, поскольку драйвер сеанса по умолчанию, файловая система, уже настроен с настройками по умолчанию.

Таким образом, именно файловая система содержит все данные, относящиеся к сеансу, и она широко используется и является принятым стандартом для обработки сеансов. При этом 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, и в завершение нашей статьи было обсуждение драйверов сессий.

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