8.6. Storing Sessions in a Database
Problem
You want to store session data in a database instead of in files. If multiple web servers all have access to the same database, the session data is then mirrored across all the web servers.
Solution
Set
session.save_handler
to user in
php.ini and use the
pc_DB_Session
class shown in Example 8-1. For example:
$s = new pc_DB_Session('mysql://user:password@localhost/db');
ini_get('session.auto_start') or session_start();Discussion
One of the most powerful aspects of the session module is its
abstraction of how sessions get saved. The
session_set_save_handler( )
function tells PHP to use different functions
for the various session operations such as saving a session and
reading session data. The pc_DB_Session
class stores the session data in a
database. If this database is shared between multiple web servers,
users’ session information is portable across all
those web servers. So, if you have a bunch of web servers behind a
load balancer, you don’t need any fancy tricks to
ensure that a user’s session data is accurate no
matter which web server they get sent to.
To use pc_DB_Session, pass a
data source name (DSN) to the class when
you instantiate it. The session data is stored in a table called
php_session
whose structure is:
CREATE TABLE php_session ( id CHAR(32) NOT NULL, data MEDIUMBLOB, last_access INT UNSIGNED NOT NULL, PRIMARY KEY(id) )
If you want the table name to be different than
php_session, set
session.save_path
in