blob: 3368a9f5db9ccbb6d0b6a9d0d94f62f95eaef998 [file] [log] [blame]
dchill423169f262012-08-11 20:12:05 -04001##############
2Session Driver
3##############
Derek Jones8ede1a22011-10-05 13:34:52 -05004
5The Session class permits you maintain a user's "state" and track their
dchill423169f262012-08-11 20:12:05 -04006activity while they browse your site. CodeIgniter offers two default
7session drivers: the classic `Cookie Driver`_, and the `Native Driver`_,
8which supports usage of the native PHP Session mechanism. In addition,
9you may create your own `Custom Drivers`_ to store session data however
10you wish, while still taking advantage of the features of the Session class.
Derek Jones8ede1a22011-10-05 13:34:52 -050011
12Initializing a Session
13======================
14
15Sessions will typically run globally with each page load, so the session
dchill423169f262012-08-11 20:12:05 -040016class must either be :doc:`initialized <../general/drivers>` in your
Derek Jones8ede1a22011-10-05 13:34:52 -050017:doc:`controller <../general/controllers>` constructors, or it can be
18:doc:`auto-loaded <../general/autoloader>` by the system. For the most
19part the session class will run unattended in the background, so simply
20initializing the class will cause it to read, create, and update
21sessions.
22
23To initialize the Session class manually in your controller constructor,
dchill423169f262012-08-11 20:12:05 -040024use the $this->load->driver function::
Derek Jones8ede1a22011-10-05 13:34:52 -050025
dchill423169f262012-08-11 20:12:05 -040026 $this->load->driver('session');
Derek Jones8ede1a22011-10-05 13:34:52 -050027
28Once loaded, the Sessions library object will be available using:
29$this->session
30
31How do Sessions work?
32=====================
33
34When a page is loaded, the session class will check to see if valid
dchill423169f262012-08-11 20:12:05 -040035session data exists in the user's session. If sessions data does **not**
36exist (or if it has expired) a new session will be created and saved.
37If a session does exist, its information will be updated. With each update,
38the session_id will be regenerated.
Derek Jones8ede1a22011-10-05 13:34:52 -050039
40It's important for you to understand that once initialized, the Session
41class runs automatically. There is nothing you need to do to cause the
42above behavior to happen. You can, as you'll see below, work with
43session data or even add your own data to a user's session, but the
44process of reading, writing, and updating a session is automatic.
45
46What is Session Data?
47=====================
48
49A *session*, as far as CodeIgniter is concerned, is simply an array
50containing the following information:
51
52- The user's unique Session ID (this is a statistically random string
53 with very strong entropy, hashed with MD5 for portability, and
54 regenerated (by default) every five minutes)
55- The user's IP Address
56- The user's User Agent data (the first 120 characters of the browser
57 data string)
58- The "last activity" time stamp.
59
60The above data is stored in a cookie as a serialized array with this
61prototype::
62
Derek Jones4b83d912011-10-05 15:42:30 -050063 [array]
64 (
65 'session_id' => random hash,
66 'ip_address' => 'string - user IP address',
67 'user_agent' => 'string - user agent data',
68 'last_activity' => timestamp
69 )
Derek Jones8ede1a22011-10-05 13:34:52 -050070
dchill423169f262012-08-11 20:12:05 -040071.. note:: Sessions are only updated every five minutes by default to
72 reduce processor load. If you repeatedly reload a page you'll notice
73 that the "last activity" time only updates if five minutes or more has
74 passed since the last time the cookie was written. This time is
75 configurable by changing the $config['sess_time_to_update'] line in
76 your system/config/config.php file.
Derek Jones8ede1a22011-10-05 13:34:52 -050077
78Retrieving Session Data
79=======================
80
81Any piece of information from the session array is available using the
82following function::
83
84 $this->session->userdata('item');
85
86Where item is the array index corresponding to the item you wish to
87fetch. For example, to fetch the session ID you will do this::
88
89 $session_id = $this->session->userdata('session_id');
90
dchill423169f262012-08-11 20:12:05 -040091.. note:: The function returns NULL if the item you are
Derek Jones8ede1a22011-10-05 13:34:52 -050092 trying to access does not exist.
93
94Adding Custom Session Data
95==========================
96
97A useful aspect of the session array is that you can add your own data
98to it and it will be stored in the user's cookie. Why would you want to
99do this? Here's one example:
100
101Let's say a particular user logs into your site. Once authenticated, you
dchill423169f262012-08-11 20:12:05 -0400102could add their username and email address to the session, making
Derek Jones8ede1a22011-10-05 13:34:52 -0500103that data globally available to you without having to run a database
104query when you need it.
105
106To add your data to the session array involves passing an array
107containing your new data to this function::
108
109 $this->session->set_userdata($array);
110
111Where $array is an associative array containing your new data. Here's an
112example::
113
Derek Jones4b83d912011-10-05 15:42:30 -0500114 $newdata = array(
115 'username' => 'johndoe',
116 'email' => 'johndoe@some-site.com',
117 'logged_in' => TRUE
118 );
Derek Jones8ede1a22011-10-05 13:34:52 -0500119
Derek Jones4b83d912011-10-05 15:42:30 -0500120 $this->session->set_userdata($newdata);
Derek Jones8ede1a22011-10-05 13:34:52 -0500121
122If you want to add userdata one value at a time, set_userdata() also
123supports this syntax.
124
125::
126
127 $this->session->set_userdata('some_name', 'some_value');
128
dchill423169f262012-08-11 20:12:05 -0400129If you want to verify that a userdata value exists, call has_userdata().
Derek Jones8ede1a22011-10-05 13:34:52 -0500130
dchill423169f262012-08-11 20:12:05 -0400131::
132
133 $this->session->has_userdata('some_name');
Derek Jones8ede1a22011-10-05 13:34:52 -0500134
135Retrieving All Session Data
136===========================
137
138An array of all userdata can be retrieved as follows::
139
Andrey Andreevecc260e2014-01-24 14:20:13 +0200140 $this->session->userdata()
Derek Jones8ede1a22011-10-05 13:34:52 -0500141
142And returns an associative array like the following::
143
Derek Jones4b83d912011-10-05 15:42:30 -0500144 Array
145 (
146 [session_id] => 4a5a5dca22728fb0a84364eeb405b601
147 [ip_address] => 127.0.0.1
148 [user_agent] => Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7;
149 [last_activity] => 1303142623
150 )
Derek Jones8ede1a22011-10-05 13:34:52 -0500151
152Removing Session Data
153=====================
154
155Just as set_userdata() can be used to add information into a session,
156unset_userdata() can be used to remove it, by passing the session key.
157For example, if you wanted to remove 'some_name' from your session
158information::
159
160 $this->session->unset_userdata('some_name');
161
162
163This function can also be passed an associative array of items to unset.
164
165::
166
Derek Jones4b83d912011-10-05 15:42:30 -0500167 $array_items = array('username' => '', 'email' => '');
168
169 $this->session->unset_userdata($array_items);
Derek Jones8ede1a22011-10-05 13:34:52 -0500170
171
172Flashdata
173=========
174
175CodeIgniter supports "flashdata", or session data that will only be
176available for the next server request, and are then automatically
177cleared. These can be very useful, and are typically used for
178informational or status messages (for example: "record 2 deleted").
179
dchill423169f262012-08-11 20:12:05 -0400180.. note:: Flash variables are prefaced with "flash\_" so avoid this prefix
181 in your own session names.
Derek Jones8ede1a22011-10-05 13:34:52 -0500182
183To add flashdata::
184
185 $this->session->set_flashdata('item', 'value');
186
187
188You can also pass an array to set_flashdata(), in the same manner as
189set_userdata().
190
191To read a flashdata variable::
192
193 $this->session->flashdata('item');
Johnathan Croom4beca5c2012-11-23 18:32:46 -0700194
Mike Funk7c26fab2012-02-24 09:45:02 -0500195An array of all flashdata can be retrieved as follows::
196
Andrey Andreevecc260e2014-01-24 14:20:13 +0200197 $this->session->flashdata();
Derek Jones8ede1a22011-10-05 13:34:52 -0500198
199
200If you find that you need to preserve a flashdata variable through an
201additional request, you can do so using the keep_flashdata() function.
Johnathan Croom4beca5c2012-11-23 18:32:46 -0700202You can either pass a single item or an array of flashdata items to keep.
Derek Jones8ede1a22011-10-05 13:34:52 -0500203
204::
205
206 $this->session->keep_flashdata('item');
Johnathan Croom4beca5c2012-11-23 18:32:46 -0700207 $this->session->keep_flashdata(array('item1', 'item2', 'item3'));
Derek Jones8ede1a22011-10-05 13:34:52 -0500208
dchill423169f262012-08-11 20:12:05 -0400209Tempdata
210========
211
212CodeIgniter also supports "tempdata", or session data with a specific
213expiration time. After the value expires, or the session expires or is
214deleted, the value is automatically removed.
215
216To add tempdata::
217
218 $expire = 300; // Expire in 5 minutes
219
220 $this->session->set_tempdata('item', 'value', $expire);
221
222You can also pass an array to set_tempdata()::
223
224 $tempdata = array('newuser' => TRUE, 'message' => 'Thanks for joining!');
225
226 $this->session->set_tempdata($tempdata, '', $expire);
227
228.. note:: If the expiration is omitted or set to 0, the default expiration of
229 5 minutes will be used.
230
231To read a tempdata variable::
232
233 $this->session->tempdata('item');
234
235If you need to remove a tempdata value before it expires,
236use unset_tempdata()::
237
238 $this->session->unset_tempdata('item');
239
240Destroying a Session
241====================
242
243To clear the current session::
244
245 $this->session->sess_destroy();
246
247.. note:: This function should be the last one called, and even flash
248 variables will no longer be available. If you only want some items
249 destroyed and not all, use unset_userdata().
250
251Session Preferences
252===================
253
254You'll find the following Session related preferences in your
Andrey Andreev2d5ebf72013-10-29 13:27:59 +0200255*application/config/config.php* file:
dchill423169f262012-08-11 20:12:05 -0400256
257=========================== =============== =========================== ==========================================================================
258Preference Default Options Description
259=========================== =============== =========================== ==========================================================================
260**sess_driver** cookie cookie/native/*custom* The initial session driver to load.
261**sess_valid_drivers** cookie, native None Additional valid drivers which may be loaded.
262**sess_cookie_name** ci_session None The name you want the session cookie saved as (data for Cookie driver or
263 session ID for Native driver).
264**sess_expiration** 7200 None The number of seconds you would like the session to last. The default
265 value is 2 hours (7200 seconds). If you would like a non-expiring
266 session set the value to zero: 0
267**sess_expire_on_close** FALSE TRUE/FALSE (boolean) Whether to cause the session to expire automatically when the browser
268 window is closed.
269**sess_encrypt_cookie** FALSE TRUE/FALSE (boolean) Whether to encrypt the session data (Cookie driver only).
270**sess_use_database** FALSE TRUE/FALSE (boolean) Whether to save the session data to a database. You must create the
271 table before enabling this option (Cookie driver only).
272**sess_table_name** ci_sessions Any valid SQL table name The name of the session database table (Cookie driver only).
273**sess_time_to_update** 300 Time in seconds This options controls how often the session class will regenerate itself
Andrey Andreev2d5ebf72013-10-29 13:27:59 +0200274 and create a new session ID. Setting it to 0 will disable session
275 ID regeneartion.
dchill423169f262012-08-11 20:12:05 -0400276**sess_match_ip** FALSE TRUE/FALSE (boolean) Whether to match the user's IP address when reading the session data.
277 Note that some ISPs dynamically changes the IP, so if you want a
278 non-expiring session you will likely set this to FALSE.
279**sess_match_useragent** TRUE TRUE/FALSE (boolean) Whether to match the User Agent when reading the session data.
280=========================== =============== =========================== ==========================================================================
281
282In addition to the values above, the cookie and native drivers apply the
283following configuration values shared by the :doc:`Input <input>` and
284:doc:`Security <security>` classes:
285
286=========================== =============== ==========================================================================
287Preference Default Description
288=========================== =============== ==========================================================================
289**cookie_prefix** '' Set a cookie name prefix in order to avoid name collisions
290**cookie_domain** '' The domain for which the session is applicable
291**cookie_path** / The path to which the session is applicable
292=========================== =============== ==========================================================================
293
294Session Drivers
295===============
296
297By default, the `Cookie Driver`_ is loaded when a session is initialized.
298However, any valid driver may be selected with the $config['sess_driver']
299line in your config.php file.
300
301The session driver library comes with the cookie and native drivers
302installed, and `Custom Drivers`_ may also be installed by the user.
303
304Typically, only one driver will be used at a time, but CodeIgniter does
305support loading multiple drivers. If a specific valid driver is called, it
306will be automatically loaded. Or, an additional driver may be explicitly
307loaded by calling load_driver()::
308
309 $this->session->load_driver('native');
310
311The Session library keeps track of the most recently selected driver to call
312for driver methods. Normally, session class methods are called directly on
313the parent class, as illustrated above. However, any methods called through
314a specific driver will select that driver before invoking the parent method.
315
316So, alternation between multiple drivers can be achieved by specifying which
317driver to use for each call::
318
319 $this->session->native->set_userdata('foo', 'bar');
320
321 $this->session->cookie->userdata('foo');
322
323 $this->session->native->unset_userdata('foo');
324
325Notice in the previous example that the *native* userdata value 'foo'
326would be set to 'bar', which would NOT be returned by the call for
327the *cookie* userdata 'foo', nor would the *cookie* value be unset by
328the call to unset the *native* 'foo' value. The drivers maintain independent
329sets of values, regardless of key names.
330
331A specific driver may also be explicitly selected for use by pursuant
332methods with the select_driver() call::
333
334 $this->session->select_driver('native');
335
336 $this->session->userdata('item'); // Uses the native driver
337
338Cookie Driver
339-------------
340
341The Cookie driver stores session information for each user as serialized
342(and optionally encrypted) data in a cookie. It can also store the session
343data in a database table for added security, as this permits the session ID
344in the user's cookie to be matched against the stored session ID. By default
345only the cookie is saved. If you choose to use the database option you'll
346need to create the session table as indicated below.
347
348If you have the encryption option enabled, the serialized array will be
349encrypted before being stored in the cookie, making the data highly
350secure and impervious to being read or altered by someone. More info
351regarding encryption can be :doc:`found here <encryption>`, although
352the Session class will take care of initializing and encrypting the data
353automatically.
354
355.. note:: Even if you are not using encrypted sessions, you must set
356 an :doc:`encryption key <./encryption>` in your config file which is used
357 to aid in preventing session data manipulation.
358
359.. note:: Cookies can only hold 4KB of data, so be careful not to exceed
360 the capacity. The encryption process in particular produces a longer
361 data string than the original so keep careful track of how much data you
362 are storing.
Derek Jones8ede1a22011-10-05 13:34:52 -0500363
364Saving Session Data to a Database
dchill423169f262012-08-11 20:12:05 -0400365^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Derek Jones8ede1a22011-10-05 13:34:52 -0500366
367While the session data array stored in the user's cookie contains a
368Session ID, unless you store session data in a database there is no way
369to validate it. For some applications that require little or no
370security, session ID validation may not be needed, but if your
371application requires security, validation is mandatory. Otherwise, an
372old session could be restored by a user modifying their cookies.
373
374When session data is available in a database, every time a valid session
375is found in the user's cookie, a database query is performed to match
376it. If the session ID does not match, the session is destroyed. Session
377IDs can never be updated, they can only be generated when a new session
378is created.
379
380In order to store sessions, you must first create a database table for
381this purpose. Here is the basic prototype (for MySQL) required by the
Derek Jones4b83d912011-10-05 15:42:30 -0500382session class::
Derek Jones8ede1a22011-10-05 13:34:52 -0500383
Derek Jones4b83d912011-10-05 15:42:30 -0500384 CREATE TABLE IF NOT EXISTS `ci_sessions` (
385 session_id varchar(40) DEFAULT '0' NOT NULL,
Andrey Andreev5a257182012-06-10 06:18:14 +0300386 ip_address varchar(45) DEFAULT '0' NOT NULL,
Derek Jones4b83d912011-10-05 15:42:30 -0500387 user_agent varchar(120) NOT NULL,
388 last_activity int(10) unsigned DEFAULT 0 NOT NULL,
389 user_data text NOT NULL,
Andrey Andreeve2afc882012-11-01 01:35:34 +0200390 PRIMARY KEY (session_id, ip_address, user_agent),
Derek Jones4b83d912011-10-05 15:42:30 -0500391 KEY `last_activity_idx` (`last_activity`)
392 );
Derek Jones8ede1a22011-10-05 13:34:52 -0500393
394.. note:: By default the table is called ci_sessions, but you can name
395 it anything you want as long as you update the
396 application/config/config.php file so that it contains the name you have
397 chosen. Once you have created your database table you can enable the
398 database option in your config.php file as follows::
399
400 $config['sess_use_database'] = TRUE;
401
402 Once enabled, the Session class will store session data in the DB.
403
404 Make sure you've specified the table name in your config file as well::
405
406 $config['sess_table_name'] = 'ci_sessions';
407
dchill423169f262012-08-11 20:12:05 -0400408.. note:: The Cookie driver has built-in garbage collection which clears
Derek Jones8ede1a22011-10-05 13:34:52 -0500409 out expired sessions so you do not need to write your own routine to do
410 it.
411
dchill423169f262012-08-11 20:12:05 -0400412Native Driver
413-------------
Derek Jones8ede1a22011-10-05 13:34:52 -0500414
dchill423169f262012-08-11 20:12:05 -0400415The Native driver relies on native PHP sessions to store data in the
416$_SESSION superglobal array. All stored values continue to be available
417through $_SESSION, but flash- and temp- data items carry special prefixes.
Derek Jones8ede1a22011-10-05 13:34:52 -0500418
dchill423169f262012-08-11 20:12:05 -0400419Custom Drivers
420--------------
Derek Jones8ede1a22011-10-05 13:34:52 -0500421
dchill423169f262012-08-11 20:12:05 -0400422You may also :doc:`create your own <../general/creating_drivers>` custom
423session drivers. A session driver basically manages an array of name/value
424pairs with some sort of storage mechanism.
Derek Jones8ede1a22011-10-05 13:34:52 -0500425
dchill42b3816b72012-08-13 09:47:58 -0400426To make a new driver, extend CI_Session_driver. Overload the initialize()
dchill423169f262012-08-11 20:12:05 -0400427method and read or create session data. Then implement a save handler to
428write changed data to storage (sess_save), a destroy handler to remove
dchill42b3816b72012-08-13 09:47:58 -0400429deleted data (sess_destroy), a regenerate handler to make a new session ID
430(sess_regenerate), and an access handler to expose the data (get_userdata).
431Your initial class might look like::
Derek Jones8ede1a22011-10-05 13:34:52 -0500432
dchill423169f262012-08-11 20:12:05 -0400433 class CI_Session_custom extends CI_Session_driver {
434 protected function initialize()
435 {
436 // Read existing session data or create a new one
437 }
Derek Jones8ede1a22011-10-05 13:34:52 -0500438
dchill423169f262012-08-11 20:12:05 -0400439 public function sess_save()
440 {
441 // Save current data to storage
442 }
443
444 public function sess_destroy()
445 {
446 // Destroy the current session and clean up storage
447 }
448
449 public function sess_regenerate()
450 {
451 // Create new session ID
452 }
453
454 public function &get_userdata()
455 {
456 // Return a reference to your userdata array
457 }
458 }
459
460Notice that get_userdata() returns a reference so the parent library is
461accessing the same array the driver object is using. This saves memory
462and avoids synchronization issues during usage.
463
464Put your driver in the libraries/Session/drivers folder anywhere in your
465package paths. This includes the application directory, the system directory,
466or any path you add with $CI->load->add_package_path(). Your driver must be
467named CI_Session_<name>, and your filename must be Session_<name>.php,
468preferably also capitalized, such as::
469
470 CI_Session_foo in libraries/Session/drivers/Session_foo.php
471
472Then specify the driver by setting 'sess_driver' in your config.php file or as a
473parameter when loading the CI_Session object::
474
475 $config['sess_driver'] = 'foo';
476
477OR::
478
479 $CI->load->driver('session', array('sess_driver' => 'foo'));
480
481The driver specified by 'sess_driver' is automatically included as a valid
482driver. However, if you want to make a custom driver available as an option
483without making it the initially loaded driver, set 'sess_valid_drivers' in
484your config.php file to an array including your driver name::
485
486 $config['sess_valid_drivers'] = array('sess_driver');