&reftitle.examples;
Basic usage As of PHP 4.1.0, $_SESSION is available as a global variable just like $_POST, $_GET, $_REQUEST and so on. Unlike $HTTP_SESSION_VARS, $_SESSION is always global. Therefore, you do not need to use the global keyword for $_SESSION. Please note that this documentation has been changed to use $_SESSION everywhere. You can substitute $HTTP_SESSION_VARS for $_SESSION, if you prefer the former. Also note that you must start your session using session_start before use of $_SESSION becomes available. The keys in the $_SESSION associative array are subject to the same limitations as regular variable names in PHP, i.e. they cannot start with a number and must start with a letter or underscore. For more details see the section on variables in this manual. If register_globals is disabled, only members of the global associative array $_SESSION can be registered as session variables. The restored session variables will only be available in the array $_SESSION. Use of $_SESSION (or $HTTP_SESSION_VARS with PHP 4.0.6 or less) is recommended for improved security and code readability. With $_SESSION, there is no need to use the session_register, session_unregister, session_is_registered functions. Session variables are accessible like any other variables. Registering a variable with <varname>$_SESSION</varname>. ]]> Unregistering a variable with <varname>$_SESSION</varname> and <link linkend="ini.register-globals">register_globals</link> disabled. ]]> Do NOT unset the whole $_SESSION with unset($_SESSION) as this will disable the registering of session variables through the $_SESSION superglobal. You can't use references in session variables as there is no feasible way to restore a reference to another variable. If register_globals is enabled, then each global variable can be registered as session variable. Upon a restart of a session, these variables will be restored to corresponding global variables. Since PHP must know which global variables are registered as session variables, users need to register variables with session_register function. You can avoid this by simply setting entries in $_SESSION. Before PHP 4.3.0, if you are using $_SESSION and you have disabled register_globals, don't use session_register, session_is_registered or session_unregister. Disabling register_globals is recommended for both security and performance reasons. If register_globals is enabled, then the global variables and the $_SESSION entries will automatically reference the same values which were registered in the prior session instance. However, if the variable is registered by $_SESSION then the global variable is available since the next request. There is a defect in PHP 4.2.3 and earlier. If you register a new session variable by using session_register, the entry in the global scope and the $_SESSION entry will not reference the same value until the next session_start. I.e. a modification to the newly registered global variable will not be reflected by the $_SESSION entry. This has been corrected in PHP 4.3.0.
Passing the Session ID There are two methods to propagate a session id: Cookies URL parameter The session module supports both methods. Cookies are optimal, but because they are not always available, we also provide an alternative way. The second method embeds the session id directly into URLs. PHP is capable of transforming links transparently. Unless you are using PHP 4.2.0 or later, you need to enable it manually when building PHP. Under Unix, pass --enable-trans-sid to configure. If this build option and the run-time option session.use_trans_sid are enabled, relative URIs will be changed to contain the session id automatically. The arg_separator.output &php.ini; directive allows to customize the argument seperator. For full XHTML conformance, specify &amp; there. Alternatively, you can use the constant SID which is defined if the session started. If the client did not send an appropriate session cookie, it has the form session_name=session_id. Otherwise, it expands to an empty string. Thus, you can embed it unconditionally into URLs. The following example demonstrates how to register a variable, and how to link correctly to another page using SID. Counting the number of hits of a single user

Hello visitor, you have seen this page times.

To continue, click here.

]]>
The htmlspecialchars may be used when printing the SID in order to prevent XSS related attacks. Printing the SID, like shown above, is not necessary if --enable-trans-sid was used to compile PHP. Non-relative URLs are assumed to point to external sites and hence don't append the SID, as it would be a security risk to leak the SID to a different server.
Custom Session Handlers To implement database storage, or any other storage method, you will need to use session_set_save_handler to create a set of user-level storage functions. As of PHP 5.4.0 you may create session handlers using the SessionHandlerInterface or extend internal PHP handlers by inheriting from SessionHandler. The callbacks specified in session_set_save_handler are methods called by PHP during the life-cycle of a session: open, read, write and close and for the housekeeping tasks of deleting stored sessions and periodic garbage collection. Therefor, PHP always requires session save handlers. The default is usually the internal 'files' save handler. A custom save handler can be set using session_set_save_handler. Alternative internal save handlers are also be provided by PHP extensions, such as sqlite, memcache and memcached and can be set with session.save_handler. When the session starts, PHP will internally call the open handler followed by the read callback which should return an encoded string extactly as it was originally passed for storage. Once the read callback returns the encoded string, PHP will decode it and then populate the resulting array into the $_SESSION superglobal. When PHP shuts down (or when session_write_close is called), PHP will internally encode the $_SESSION superglobal and pass this along with the session ID to the the write callback. After the write callback has finished, PHP will internally invoke the close callback handler. When a session is specifically destroyed, PHP will call the destroy() handler with the session ID. PHP will call the gc callback from time to time to expire any session records according to the set max lifetime of a session. This routine should delete all records from persistent storage which were last accessed longer than the $lifetime.