How to share session data across multiple domains on same server?

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Mas Heru
    New Member
    • Jan 2011
    • 2

    How to share session data across multiple domains on same server?

    I heard the best method to share session across multiple domains on same server is to use custom php session handler. (ie, domain name different like abc.com, xyz.com but single application.)

    But after i tried it, even custom php session handler that using SAME DATABASE ON 1 SERVER can't share session, when i tried to read cookie value from different domain.

    Here's my custom session handler, Please kindly check or fix if something missing here. because i've tried it for a week now. can't get it to work



    SESSION_INCLUDE .PHP
    Code:
    <?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 Table
    Code:
    create table sess_data (
    id2 int not null auto_increment,
    id text not null,
    data text,
    expire int not null,
    primary key(id2)
    );
  • dlite922
    Recognized Expert Top Contributor
    • Dec 2007
    • 1586

    #2
    What you've done is just change the location of where PHP stores information. I don't see any code that tells it to share this across multiple domains.

    I'd go back to where you 'heard' about this and ask them what else you need to do different.

    If I had to guess, I'd guess that your read would now need to look up the record with something other-than $id. It has to be a custom id that YOU makeup for your clients. That PHP id you're currently using is issued by PHP and PHP does not share that ID between domains.

    Cheers,


    Dan

    Comment

    • Mas Heru
      New Member
      • Jan 2011
      • 2

      #3
      "I don't see any code that tells it to share this across multiple domains."

      because it's still on testing phase i just use firefox addon to manually change the ssid cookie value myself.. so the value of the session is same with the old domain.. no problem with that. & on real life i can just pass that old session id from old domain to new domain using $_GET

      Comment

      Working...