$session_id))->fetchField(); } // If the caller doesn't want to create a new session if it didn't exist, // then return here. else if (!$create) { // Return a negative value here, since it won't collide with any // session_api IDs. return -1; } else { $session_id = drupal_hash_base64(uniqid(mt_rand(), TRUE)); } // For the cookie we use the same domain that Drupal's own session cookie uses. $cookie_domain = ini_get('session.cookie_domain'); // Update the session timeout. if ($sid) { $rec = new stdClass; $rec->sid = $sid; $rec->timestamp = REQUEST_TIME; $rec->session_id = $session_id; drupal_write_record('session_api', $rec, 'sid'); setcookie('session_api_session', $session_id, REQUEST_TIME + variable_get('session_api_cookie_expire_time', 2592000), '/', $cookie_domain); } // No sid exists, create new one. else { $rec = new stdClass(); $rec->timestamp = REQUEST_TIME; $rec->session_id = $session_id; drupal_write_record('session_api', $rec); $sid = $rec->sid; // Set cookie. setcookie('session_api_session', $session_id, REQUEST_TIME + variable_get('session_api_cookie_expire_time', 2592000), '/', $cookie_domain); } } return $sid; } /** * Implement hook_menu(). */ function session_api_menu() { $items['admin/config/development/session-api'] = array( 'title' => t('Session API Configuration'), 'description' => t('Configure Session API behavior.'), 'access arguments' => array('administer site configuration'), 'page callback' => 'drupal_get_form', 'page arguments' => array('session_api_settings_form'), 'file' => 'session_api.admin.inc', ); return $items; } /** * Implement hook_cron(). */ function session_api_cron() { // Fetch list of outdated sids. $query = db_select('session_api', 'sap'); $query->leftJoin('sessions', 's', 'sap.sid = s.sid'); $query->fields('sap', array('sid')); $query->condition('sap.timestamp', REQUEST_TIME - variable_get('session_api_cookie_expire_time', 2592000), '<'); $outdated_sids = $query->execute()->fetchCol(); if (!empty($outdated_sids)) { module_invoke_all('session_api_cleanup', $outdated_sids); db_query('DELETE FROM {session_api} WHERE sid IN (:sids)', array(':sids' => $outdated_sids)); } }