blob: 69cc6ba59f1f5e50133c80aac8cbe791aa0209ac [file] [log] [blame]
Derek Allard309d63f2007-08-17 11:49:29 +00001<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Derek Allardafd99ac2008-01-19 19:59:14 +00002<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
Derek Allard309d63f2007-08-17 11:49:29 +00003<head>
4
Derek Allard28393bf2008-04-10 11:26:01 +00005<title>CodeIgniter User Guide : Session Class</title>
Derek Allard309d63f2007-08-17 11:49:29 +00006
7<style type='text/css' media='all'>@import url('../userguide.css');</style>
8<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' />
9
10<script type="text/javascript" src="../nav/nav.js"></script>
11<script type="text/javascript" src="../nav/prototype.lite.js"></script>
12<script type="text/javascript" src="../nav/moo.fx.js"></script>
Derek Allardb3412372007-10-25 12:15:16 +000013<script type="text/javascript" src="../nav/user_guide_menu.js"></script>
Derek Allard309d63f2007-08-17 11:49:29 +000014
15<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
16<meta http-equiv='expires' content='-1' />
17<meta http-equiv= 'pragma' content='no-cache' />
18<meta name='robots' content='all' />
Derek Allard3d879d52008-01-18 19:41:32 +000019<meta name='author' content='ExpressionEngine Dev Team' />
Derek Allard309d63f2007-08-17 11:49:29 +000020<meta name='description' content='CodeIgniter User Guide' />
21
22</head>
23<body>
24
25<!-- START NAVIGATION -->
26<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div>
27<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle.jpg" width="153" height="44" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div>
28<div id="masthead">
29<table cellpadding="0" cellspacing="0" border="0" style="width:100%">
30<tr>
Derek Allard197d10b2008-02-12 04:20:38 +000031<td><h1>CodeIgniter User Guide Version 1.6.1</h1></td>
Derek Allard309d63f2007-08-17 11:49:29 +000032<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td>
33</tr>
34</table>
35</div>
36<!-- END NAVIGATION -->
37
38
39<!-- START BREADCRUMB -->
40<table cellpadding="0" cellspacing="0" border="0" style="width:100%">
41<tr>
42<td id="breadcrumb">
Derek Jones7a9193a2008-01-21 18:39:20 +000043<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp;
Derek Allard309d63f2007-08-17 11:49:29 +000044<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp;
45Session Class
46</td>
47<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td>
48</tr>
49</table>
50<!-- END BREADCRUMB -->
51
52<br clear="all" />
53
54
55<!-- START CONTENT -->
56<div id="content">
57
58
59<h1>Session Class</h1>
60
61<p>The Session class permits you maintain a user's "state" and track their activity while they browse your site.
62The Session class stores session information for each user as serialized (and optionally encrypted) data in a cookie.
63It can also store the session data in a database table for added security, as this permits the session ID in the
64user's cookie to be matched against the stored session ID. By default only the cookie is saved. If you choose to
65use the database option you'll need to create the session table as indicated below.
66</p>
67
68<p class="important"><strong>Note:</strong> The Session class does <strong>not</strong> utilize native PHP sessions. It
69generates its own session data, offering more flexibility for developers.</p>
70
71<h2>Initializing a Session</h2>
72
73<p>Sessions will typically run globally with each page load, so the session class must either be
74<a href="../general/libraries.html">initialized</a> in your
75<a href="../general/controllers.html">controller</a> constructors, or it can be
76<a href="../general/autoloader.html">auto-loaded</a> by the system.
77For the most part the session class will run unattended in the background, so simply initializing the class
78will cause it to read, create, and update sessions.</p>
79
80
81<p>To initialize the Session class manually in your controller constructor, use the <dfn>$this->load->library</dfn> function:</p>
82
83<code>$this->load->library('session');</code>
84<p>Once loaded, the Sessions library object will be available using: <dfn>$this->session</dfn></p>
85
86
87<h2>How do Sessions work?</h2>
88
89<p>When a page is loaded, the session class will check to see if valid session data exists in the user's session cookie.
90If sessions data does <strong>not</strong> exist (or if it has expired) a new session will be created and saved in the cookie.
91If a session does exist, its information will be updated and the cookie will be updated. With each update, the session_id will be regenerated.</p>
92
93<p>It's important for you to understand that once initialized, the Session class runs automatically. There is nothing
94you need to do to cause the above behavior to happen. You can, as you'll see below, work with session data or
95even add your own data to a user's session, but the process of reading, writing, and updating a session is automatic.</p>
96
97
98<h2>What is Session Data?</h2>
99
100<p>A <em>session</em>, as far as CodeIgniter is concerned, is simply an array containing the following information:</p>
101
102<ul>
103<li>The user's unique Session ID (this is a statistically random string with very strong entropy, hashed with MD5 for portability, and regenerated (by default) every five minutes)</li>
104<li>The user's IP Address</li>
105<li>The user's User Agent data (the first 50 characters of the browser data string)</li>
Derek Allard58626b32008-02-11 01:38:10 +0000106<li>The "last activity" time stamp.</li>
Derek Allard309d63f2007-08-17 11:49:29 +0000107</ul>
108
109<p>The above data is stored in a cookie as a serialized array with this prototype:</p>
110
111<code>[array]<br />
112(<br />
113&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'session_id'&nbsp;&nbsp;&nbsp;&nbsp;=> random hash,<br />
114&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'ip_address'&nbsp;&nbsp;&nbsp;&nbsp;=> 'string - user IP address',<br />
115&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'user_agent'&nbsp;&nbsp;&nbsp;&nbsp;=> 'string - user agent data',<br />
Derek Allard58626b32008-02-11 01:38:10 +0000116&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'last_activity' => timestamp<br />
Derek Allard309d63f2007-08-17 11:49:29 +0000117)</code>
118
119<p>If you have the encryption option enabled, the serialized array will be encrypted before being stored in the cookie,
120making the data highly secure and impervious to being read or altered by someone. More info regarding encryption
121can be <a href="encryption.html">found here</a>, although the Session class will take care of initializing
122and encrypting the data automatically.</p>
123
124<p>Note: Session cookies are only updated every five minutes by default to reduce processor load. If you repeatedly reload a page
125you'll notice that the "last activity" time only updates if five minutes or more has passed since the last time
Derek Allard866b8132008-04-21 22:02:37 +0000126the cookie was written. This time is configurable by changing the $config['time_to_update'] line in your system/config/config.php file.</p>
Derek Allard309d63f2007-08-17 11:49:29 +0000127
128<h2>Retrieving Session Data</h2>
129
130<p>Any piece of information from the session array is available using the following function:</p>
131
132<code>$this->session->userdata('<samp>item</samp>');</code>
133
134<p>Where <samp>item</samp> is the array index corresponding to the item you wish to fetch. For example, to fetch the session ID you
135will do this:</p>
136
137<code>$session_id = $this->session->userdata('<samp>session_id</samp>');</code>
138
139<p><strong>Note:</strong> The function returns FALSE (boolean) if the item you are trying to access does not exist.</p>
140
141
142<h2>Adding Custom Session Data</h2>
143
144<p>A useful aspect of the session array is that you can add your own data to it and it will be stored in the user's cookie.
145Why would you want to do this? Here's one example:</p>
146
147<p>Let's say a particular user logs into your site. Once authenticated,
148you could add their username and email address to the session cookie, making that data globally available to you without
149having to run a database query when you need it.</p>
150
151<p>To add your data to the session array involves passing an array containing your new data to this function:</p>
152
153<code>$this->session->set_userdata(<samp>$array</samp>);</code>
154
155<p>Where <samp>$array</samp> is an associative array containing your new data. Here's an example:</p>
156
157
158<p><code>$newdata = array(<br />
159 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'username'&nbsp; => 'johndoe',<br />
160 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'email'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'johndoe@some-site.com',<br />
161 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'logged_in' => TRUE<br />
162 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />
163 <br />
164 $this->session->set_userdata(<samp>$newdata</samp>);</code></p>
165<p>If you want to add userdata one value at a time, set_userdata() also supports this syntax. </p>
166<p><code>$this-&gt;session-&gt;set_userdata('some_name', 'some_value');</code></p>
167<p class="important"><strong>Note:</strong> Cookies can only hold 4KB of data, so be careful not to exceed the capacity. The
168encryption process in particular produces a longer data string than the original so keep careful track of how much data you are storing.</p>
169
170<h2>Removing Session Data</h2>
171<p>Just as set_userdata() can be used to add information into a session, unset_userdata() can be used to remove it, by passing the session key. For example, if you wanted to remove 'some_name' from your session information: </p>
172<p><code>$this-&gt;session-&gt;unset_userdata('some_name');</code></p>
Derek Jones4f953532007-09-10 16:37:12 +0000173<p>This function can also be passed an associative array of items to unset.</p>
174<p><code>$array_items = array('username' => '', 'email' => '');<br />
Derek Allard309d63f2007-08-17 11:49:29 +0000175<br />
Derek Jones4f953532007-09-10 16:37:12 +0000176$this-&gt;session-&gt;unset_userdata(<samp>$array_items</samp>);</code></p>
Derek Allard309d63f2007-08-17 11:49:29 +0000177<h2>Flashdata</h2>
Derek Allard2db431b2008-01-22 07:45:30 +0000178<p>CodeIgniter supports &quot;flashdata&quot;, or session data that will only be available for the next server request, and are then automatically cleared. These can be very useful, and are typically used for informational or status messages (for example: &quot;record 2 deleted&quot;).</p>
Derek Allard309d63f2007-08-17 11:49:29 +0000179<p>Note: Flash variables are prefaced with &quot;flash_&quot; so avoid this prefix in your own session names.</p>
180<p>To add flashdata:</p>
181<p><code>$this-&gt;session-&gt;set_flashdata('item', 'value');</code></p>
182<p>You can also pass an array to set_flashdata(), in the same manner as set_userdata(). </p>
183<p>To read a flashdata variable:</p>
184<p><code>$this-&gt;session-&gt;flashdata('item');</code></p>
185<p>If you find that you need to preserve a flashdata variable through an additional request, you can do so using the keep_flashdata() function.</p>
186<p><code>$this-&gt;session-&gt;keep_flashdata('item');</code></p>
187<h2>Saving Session Data to a Database</h2>
188<p>While the session data array stored in the user's cookie contains a Session ID,
189unless you store session data in a database there is no way to validate it. For some applications that require little or no
190security, session ID validation may not be needed, but if your application requires security, validation is mandatory.</p>
191
192<p>When session data is available in a database, every time a valid session is found in the user's cookie, a database
193query is performed to match it. If the session ID does not match, the session is destroyed. Session IDs can never
194be updated, they can only be generated when a new session is created.</p>
195
196<p>In order to store sessions, you must first create a database table for this purpose. Here is the basic
197prototype (for MySQL) required by the session class:</p>
198
199<textarea class="textarea" style="width:100%" cols="50" rows="8">
200CREATE TABLE IF NOT EXISTS `ci_sessions` (
201session_id varchar(40) DEFAULT '0' NOT NULL,
202ip_address varchar(16) DEFAULT '0' NOT NULL,
203user_agent varchar(50) NOT NULL,
204last_activity int(10) unsigned DEFAULT 0 NOT NULL,
205PRIMARY KEY (session_id)
206);</textarea>
207
208<p><strong>Note:</strong> By default the table is called <dfn>ci_sessions</dfn>, but you can name it anything you want
209as long as you update the <kbd>application/config/config.php</kbd> file so that it contains the name you have chosen.
210Once you have created your database table you can enable the database option in your config.php file as follows:</p>
211
212<code>$config['sess_use_database'] = TRUE;</code>
213
214<p>Once enabled, the Session class will store session data in the DB.</p>
215
216<p>Make sure you've specified the table name in your config file as well:</p>
217
218<code>$config['sess_table_name'] = 'ci_sessions";</code>
219
220<p class="important"><strong>Note:</strong> The Session class has built-in garbage collection which clears out expired sessions so you
221do not need to write your own routine to do it.</p>
222
223
224<h2>Destroying a Session </h2>
225<p>To clear the current session: </p>
226<code>$this-&gt;session-&gt;sess_destroy();</code>
Derek Allard112f4a72008-03-19 11:36:07 +0000227<p class="important"><strong>Note:</strong> This function should be the last one called, and even flash variables will no longer be available. If you only want some items destroyed and not all, use <dfn>unset_userdata()</dfn>.</p>
228
229
230
Derek Allard309d63f2007-08-17 11:49:29 +0000231<h2>Session Preferences</h2>
232<p>You'll find the following Session related preferences in your <kbd>application/config/config.php</kbd> file:</p>
233
234
235<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder">
236<tr>
Derek Allard5b0a8812008-01-21 14:26:33 +0000237 <th>Preference</th>
238 <th>Default</th>
239 <th>Options</th>
240 <th>Description</th>
241</tr>
242<tr>
243 <td class="td"><strong>sess_cookie_name</strong></td>
244 <td class="td">ci_session</td>
245 <td class="td">None</td>
Derek Allard9b9a18e2008-03-31 19:41:03 +0000246 <td class="td">The name you want the session cookie saved as.</td>
Derek Allard5b0a8812008-01-21 14:26:33 +0000247</tr>
248<tr>
249 <td class="td"><strong>sess_expiration</strong></td>
250 <td class="td">7200</td>
251 <td class="td">None</td>
252 <td class="td">The number of seconds you would like the session to last. The default value is 2 hours (7200 seconds). If you would like a non-expiring session set the value to zero: 0</td>
253</tr>
254<tr>
255 <td class="td"><strong>sess_encrypt_cookie</strong></td>
256 <td class="td">FALSE</td>
257 <td class="td">TRUE/FALSE (boolean)</td>
258 <td class="td">Whether to encrypt the session data.</td>
259</tr>
260<tr>
261 <td class="td"><strong>sess_use_database</strong></td>
262 <td class="td">FALSE</td>
263 <td class="td">TRUE/FALSE (boolean)</td>
264 <td class="td">Whether to save the session data to a database. You must create the table before enabling this option.</td>
265</tr>
266<tr>
267 <td class="td"><strong>sess_table_name</strong></td>
268 <td class="td">ci_sessions</td>
269 <td class="td">Any valid SQL table name</td>
270 <td class="td">The name of the session database table.</td>
271</tr>
272<tr>
273 <td class="td"><strong>sess_time_to_update</strong></td>
274 <td class="td">300</td>
Derek Allard1a6cdd12008-02-07 18:46:17 +0000275 <td class="td">Time in seconds</td>
Derek Allard5b0a8812008-01-21 14:26:33 +0000276 <td class="td">This options controls how often the session class will regenerate itself and create a new session id.</td>
277</tr>
278<tr>
279 <td class="td"><strong>sess_match_ip</strong></td>
280 <td class="td">FALSE</td>
281 <td class="td">TRUE/FALSE (boolean)</td>
282 <td class="td">Whether to match the user's IP address when reading the session data. Note that some ISPs dynamically
283 changes the IP, so if you want a non-expiring session you will likely set this to FALSE.</td>
284</tr>
285<tr>
286 <td class="td"><strong>sess_match_useragent</strong></td>
287 <td class="td">TRUE</td>
288 <td class="td">TRUE/FALSE (boolean)</td>
289 <td class="td">Whether to match the User Agent when reading the session data.</td>
Derek Allard309d63f2007-08-17 11:49:29 +0000290</tr>
291</table>
292
293
294</div>
295<!-- END CONTENT -->
296
297
298<div id="footer">
299<p>
300Previous Topic:&nbsp;&nbsp;<a href="pagination.html">Pagination Class</a>
301&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
302<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
303<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp;
304Next Topic:&nbsp;&nbsp;<a href="trackback.html">Trackback Class</a>
305</p>
Derek Jones07870432008-02-13 03:49:26 +0000306<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006-2008 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">Ellislab, Inc.</a></p>
Derek Allard309d63f2007-08-17 11:49:29 +0000307</div>
308
309</body>
adminb0dd10f2006-08-25 17:25:49 +0000310</html>