I heard that the best way to exchange sessions between multiple domains on the same server is to use your own php session handler. (i.e. the domain name is different from abc.com, xyz.com, but one application.)
But after I tried it, even a custom php session handler using SAME DATABASE ON 1 SERVER cannot use the session when I tried to read the cookie value from another domain.
Here is my user session handler, please check or correct if something is missing here. because I tried this for a week. can't make it work
PS To get the previous session identifier, I use the link, for example: newdomain.com/?ssid=[SESSION_ID]
SESSION_INCLUDE.PHP
<?php // config $m_host = "localhost"; //MySQL Host $m_user = "db_user"; //MySQL User $m_pass = "db_pass"; //MySQL Pass $m_db = "db_name"; //MySQL Database $table = "sess_data"; $session_expire = 600; // Session expire time, in seconds (minutes * 60 = seconds) $gc_probability = 100; // Probability that the garbage collection function will be called. 50% chance by default ini_set("session.gc_probability",$gc_probability); /* Open function; Opens/starts session Opens a connection to the database and stays open until specifically closed This function is called first and with each page load */ function open ($s,$n) // do not modify function parameters { global $session_connection, $m_host, $m_user, $m_pass, $m_db; $session_connection = mysql_pconnect($m_host,$m_user,$m_pass); mysql_select_db($m_db,$session_connection); return true; } /* Read function; downloads data from repository to current session Queries the mysql database, unencrypts data, and returns it. This function is called after 'open' with each page load. */ function read ($id) // do not modify function parameters { global $session_connection,$session_read,$table; $query = "SELECT data FROM `$table` WHERE id=\"{$id}\""; $res = mysql_query($query,$session_connection); if(mysql_num_rows($res) != 1) return ""; // must return string, not 'false' else { $session_read = mysql_fetch_assoc($res); $session_read["data"] = base64_decode($session_read["data"]); return $session_read["data"]; } } function write ($id,$data) // do not modify function parameters { if(!$data) { return false; } global $session_connection, $session_read, $session_expire, $table; $expire = time() + $session_expire; $data = mysql_real_escape_string(base64_encode($data)); if($session_read) $query = "UPDATE `$table` SET data=\"{$data}\", expire=\"{$expire}\" WHERE id=\"{$id}\""; else $query = "INSERT INTO sess_data SET id=\"{$id}\", data=\"{$data}\", expire=\"{$expire}\""; mysql_query($query,$session_connection); return true; } function close () { global $session_connection; mysql_close($session_connection); return true; } function destroy ($id) // do not modify function parameters { global $session_connection,$table; $query = "DELETE FROM `$table` WHERE id=\"{$id}\""; mysql_query($query,$session_connection); return true; } function gc ($expire) { global $session_connection,$table; $query = "DELETE FROM `$table` WHERE expire < ".time(); mysql_query($query,$session_connection); } // Set custom handlers session_set_save_handler ("open", "close", "read", "write", "destroy", "gc"); // Start session session_start(); ?>
MySQL database description
create table sess_data ( id2 int not null auto_increment, id text not null, data text, expire int not null, primary key(id2) );