PHP session in Drupal

Ít nhất 2 lần tôi đã từng sống dở chết dở với vấn đề chết session trong Drupal. Đang chạy ngon lại lăn đùng ra chết. Qua tìm hiểu mới biết, lý do như sau :(

function sess_read($key) { global $user;

// Write and Close handlers are called after destructing objects since PHP 5.0.5 // Thus destructors can use sessions but session handler can't use objects. // So we are moving session closure before destructing objects. register_shutdown_function('session_write_close');

// Handle the case of first time visitors and clients that don't store cookies (eg. web crawlers). if (!isset($_COOKIE[session_name()])) { $user = drupal_anonymous_user(); return ''; }

// Otherwise, if the session is still active, we have a record of the client's session in the database. $user = db_fetch_object(db_query("SELECT u.*, s.* FROM {users} u INNER JOIN {sessions} s ON u.uid = s.uid WHERE s.sid = '%s'", $key));

// We found the client's session record and they are an authenticated user if ($user && $user->uid > 0) { // This is done to unserialize the data member of $user $user = drupal_unpack($user);

// Add roles element to $user $user->roles = array(); $user->roles[DRUPAL_AUTHENTICATED_RID] = 'authenticated user'; $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); while ($role = db_fetch_object($result)) { $user->roles[$role->rid] = $role->name; } } // We didn't find the client's record (session has expired), or they are an anonymous user. else { $session = isset($user->session) ? $user->session : ''; $user = drupal_anonymous_user($session); }

return $user->session; }

Tức là Drupal lưu session trong Database, nếu là authenticated user thì sẽ lưu trong DB với uid tương ứng, còn không thì sẽ lưu với uid=0. Do vô tình (không cẩn thận), tôi đã xóa mất thằng uid=0 đó nên session die là đương nhiên :p

Từ giờ chắc sẽ không còn mắc cái lỗi đó nữa ^^