session.inc

  1. drupal
    1. 4.6 includes/session.inc
    2. 4.7 includes/session.inc
    3. 5 includes/session.inc
    4. 6 includes/session.inc
    5. 7 includes/session.inc
    6. 8 core/includes/session.inc

User session handling functions.

Functions & methods

NameDescription
sess_close
sess_destroy
sess_gc
sess_open
sess_read
sess_regenerateCalled when an anonymous user becomes authenticated or vice-versa.
sess_write

File

includes/session.inc
View source
  1. <?php
  2. /**
  3. * @file
  4. * User session handling functions.
  5. */
  6. function sess_open($save_path, $session_name) {
  7. return TRUE;
  8. }
  9. function sess_close() {
  10. return TRUE;
  11. }
  12. function sess_read($key) {
  13. global $user;
  14. // Write and Close handlers are called after destructing objects since PHP 5.0.5
  15. // Thus destructors can use sessions but session handler can't use objects.
  16. // So we are moving session closure before destructing objects.
  17. register_shutdown_function('session_write_close');
  18. // retrieve data for a $user object
  19. $result = db_query("SELECT sid FROM {sessions} WHERE sid = '%s'", $key);
  20. if (!db_num_rows($result)) {
  21. $result = db_query("SELECT u.* FROM {users} u WHERE u.uid = 0");
  22. }
  23. else {
  24. $result = db_query("SELECT u.*, s.* FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.sid = '%s'", $key);
  25. }
  26. // Build $user object:
  27. $user = db_fetch_object($result);
  28. $user = drupal_unpack($user);
  29. // Add roles element to $user:
  30. $user->roles = array();
  31. if ($user->uid) {
  32. $user->roles[DRUPAL_AUTHENTICATED_RID] = 'authenticated user';
  33. $result = db_query("SELECT r.rid, r.name FROM {role} r INNER JOIN {users_roles} ur ON ur.rid = r.rid WHERE ur.uid = %d", $user->uid);
  34. while ($role = db_fetch_object($result)) {
  35. $user->roles[$role->rid] = $role->name;
  36. }
  37. }
  38. else {
  39. $user->roles[DRUPAL_ANONYMOUS_RID] = 'anonymous user';
  40. }
  41. return !empty($user->session) ? $user->session : '';
  42. }
  43. function sess_write($key, $value) {
  44. global $user;
  45. $result = db_query("SELECT sid FROM {sessions} WHERE sid = '%s'", $key);
  46. if (!db_num_rows($result)) {
  47. // Only save session data when when the browser sends a cookie. This keeps
  48. // crawlers out of session table. This improves speed up queries, reduces
  49. // memory, and gives more useful statistics. We can't eliminate anonymous
  50. // session table rows without breaking throttle module and "Who's Online"
  51. // block.
  52. if ($user->uid || $value || count($_COOKIE)) {
  53. db_query("INSERT INTO {sessions} (sid, uid, cache, hostname, session, timestamp) VALUES ('%s', %d, %d, '%s', '%s', %d)", $key, $user->uid, $user->cache, $_SERVER["REMOTE_ADDR"], $value, time());
  54. }
  55. }
  56. else {
  57. db_query("UPDATE {sessions} SET uid = %d, cache = %d, hostname = '%s', session = '%s', timestamp = %d WHERE sid = '%s'", $user->uid, $user->cache, $_SERVER["REMOTE_ADDR"], $value, time(), $key);
  58. // TODO: this can be an expensive query. Perhaps only execute it every x minutes. Requires investigation into cache expiration.
  59. if ($user->uid) {
  60. db_query("UPDATE {users} SET access = %d WHERE uid = %d", time(), $user->uid);
  61. }
  62. }
  63. return TRUE;
  64. }
  65. /**
  66. * Called when an anonymous user becomes authenticated or vice-versa.
  67. */
  68. function sess_regenerate() {
  69. $old_session_id = session_id();
  70. // We code around http://bugs.php.net/bug.php?id=32802 by destroying
  71. // the session cookie by setting expiration in the past (a negative
  72. // value). This issue only arises in PHP versions before 4.4.0,
  73. // regardless of the Drupal configuration.
  74. // TODO: remove this when we require at least PHP 4.4.0
  75. if (isset($_COOKIE[session_name()])) {
  76. setcookie(session_name(), '', time() - 42000, '/');
  77. }
  78. session_regenerate_id();
  79. db_query("UPDATE {sessions} SET sid = '%s' WHERE sid = '%s'", session_id(), $old_session_id);
  80. }
  81. function sess_destroy($key) {
  82. db_query("DELETE FROM {sessions} WHERE sid = '%s'", $key);
  83. }
  84. function sess_gc($lifetime) {
  85. // Be sure to adjust 'php_value session.gc_maxlifetime' to a large enough
  86. // value. For example, if you want user sessions to stay in your database
  87. // for three weeks before deleting them, you need to set gc_maxlifetime
  88. // to '1814400'. At that value, only after a user doesn't log in after
  89. // three weeks (1814400 seconds) will his/her session be removed.
  90. db_query("DELETE FROM {sessions} WHERE timestamp < %d", time() - $lifetime);
  91. return TRUE;
  92. }
Login or register to post comments