精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● PHP>>Session 使用>>为php3增加session的功能

主题:为php3增加session的功能
发信人: sltongyong()
整理人: jackyz(2000-10-16 22:48:56), 站内信件
php3中没有session的功能,以下是一个php4的backport,能为php3提供session

的管理。资料来源:http://www.phpwizard.net/phpChat。既然斑竹赞成直接
贴源码,我就把它贴出来吧。:-)

file: sessions.php3
-----------------------------------------------------
<?
/*********************************************************************
********
*
*
* Web Application Development with PHP
*
* by
*
* Tobias Ratschiller and Till Gerken
*
*
*
* Copyright (c) 2000, New Riders Publishing
*
*
*
*********************************************************************
********
*
*
* $Title: PHP 3 implementation of PHP 4's session management API $
*
* $Chapter: Web Application Concepts $
*
* $Executable: false $
*
*
*
* $Description:
*
* This is a backport of the PHP 4 session_* functions to native PHP -
so *
* that you can use the same session management functions under both
*
* versions of PHP. They're believed to be about 75% compatible at the
*
* moment, but it's already possible to use the most common stuff. $
*
*
*
*********************************************************************
********/

/*
* Differences from PHP 4:
* - no URL rewriting (of course)
* - options aren't specified in the php.ini but in the session c
lass below
* - auto_start doesn't work with user callbacks
* - the session ID is produced by a different algorithm
* - shared memory support is still missing
* - <?=SID?> doesn't work - use <?print($SID);?>
 *      - the WDDX serializer doesn't work yet.
 *      - serializing objects is limited due to PHP 3's serializer()
 *
 *      Notes:
 *          The session class contains the configuration variables. Th
is is the
 *          only part of the code you should need to edit.
 *
 *          To reproduce the module concept used in PHP 4's session li
brary, we
 *          use classes. An example class has been been provided: file
s. You can
 *          easily create your own classes, for example a class mysql 
to store
 *          session data to MySQL. It needs to provide the following f
unctions:
 *          bool open(string save_path, string sess_name):
 *              used on startup of a session to initialize variables o
r memory
 *              returns false on error or true on success
 *          bool close:
 *              used on shutdown of a session to unset variables or fr
ee memory 
 *          mixed read(string sess_id):
 *              reads the session data of the session identified with 
sess_id.
 *              returns false on error or the serialized session data

 *          bool write(string sess_id, string val):
 *              saves the session data of the session identified with 
sess_id
 *              returns false on error or true on success
 *          bool destroy(string sess_id):
 *              destroy the session identified with sess_id
 *              returns false on error or true on success
 *          bool gc(int max_lifetime):
 *              provides garbage collection to remove sessions older t
han 
 *              time() - max_lifetime
 *              returns false on error or true on success
 *          
 *          While it may be faster to provide your own class, the reco
mmended way
 *          to add storage modules is to use session_set_save_handler(
), as this
 *          is compatible to PHP 4.
 */

$SID = "";
class session
{
    // Public variables
    var $auto_start = true;
    var $save_path = "/tmp";
    var $name = "PHPSESSID";    
    var $save_handler = "files";
    var $lifetime = 0;
    var $gc_probability = 1;
    var $gc_maxlifetime = 0;
    var $serialize_handler = "php";
    var $extern_referer_check = false;  
    var $use_cookies = true;
    var $ID;          

    // Private variables
    var $nr_open_sessions = 0;
    var $mod_name = "";
    var $id;
    var $delimiter = "\n";
    var $delimiter_value = "[==]";
    
    function session()
    {
        $this->mod_name = $this->save_handler;
    }
}

class user
{
    var $open_func;
    var $close_func;
    var $read_func;
    var $write_func;
    var $destroy_func;
    var $gc_func;
    
    function open($save_path, $sess_name)
    {
        $func = $this->open_func;
        if(function_exists($func))
        {
            return($func($save_path, $sess_name));
        }
        
        return(true);
    } 

    function close($save_path, $sess_name)
    {
        $func = $this->close_func;
        if(function_exists($func))
        {        
            return($func());
        }
        
        return(true);
    } 

    function read($sess_id)
    {
        $func = $this->read_func;
        
        return($func($sess_id));
    }    

    function write($sess_id, $val)
    {
        $func = $this->write_func;
        
        return($func($sess_id, $val));
    }    

    function destroy($sess_id)
    {
        $func = $this->destroy_func;
        if(function_exists($func))
        {        
            return($func($sess_id));
        }
        
        return(true);
    }    

    function gc($max_lifteime)
    {
        $func = $this->gc_func;
        if(function_exists($func))
        {        
            return($func($max_lifetime));
        }
        
        return(true);
    }    

}

class files
{
    function open($save_path, $sess_name)
    {
        return(true);
    }

    function close()
    {
        return(true);    
    }
    
    function read($sess_id)
    {
        global $session;

        // Open, read in, close file with session data
        $file = $session->save_path."/sess$sess_id";
        if (!file_exists($file))
        {
            // Create it
            touch($file);
        }
        $fp = fopen($file, "r") or die("Could not open session file ($
file).");
        $val = fread($fp, filesize($file));
        fclose($fp);
        
        return($val);
    }
    
    function write($sess_id, $val)
    {
        global $session;

        // Open, write to, close file with session data
        $file = $session->save_path."/sess$sess_id";
        $fp = fopen($file, "w") or die("Could not write session file (
$file)");
        $val = fputs($fp, $val);
        fclose($fp);
        
        return(true);
    }

    function destroy($sess_id)
    {
        global $session;
        
        $file = $session->save_path."/sess$sess_id";
        unlink($file);
        
        return(true);    
    }
      
    function gc($max_lifetime)
    {
        // We return true, since all cleanup should be handled by
    // an external entity (i.e. find -ctime x | xargs rm)
        return(true);    
    }         
}


function _session_create_id()
{
    return(md5(uniqid(microtime())));
}

function _php_encode()
{
    global $session;
    
    $ret = "";
    // Create a string containing the serialized variables
    for ($i=0; $i<count($session->vars); $i++)
    {
        $ret .= $session->vars[$i].$session->delimiter_value.serialize
($GLOBALS[$session->vars[$i]]).$session->delimiter;
    }
    
    return($ret);
}

function _php_decode($data)
{
    global $session;
    
    $data = trim($data);
    $vars = explode($session->delimiter, $data);

    // Add the variables to the global namespace
    for ($i=0; $i<count($vars); $i++)
{
$tmp = explode($session->delimiter_value, $vars[$i]);
        $name = trim($tmp[0]);
        $value = trim($tmp[1]);
        $GLOBALS[$name] = unserialize($value);
    }
}

function _wddx_encode($data)
{
    global $session;
    
    $ret = wddx_serialize_vars($session->vars);
    return($ret);
}

function _wddx_decode($data)
{
    return(wddx_deserialize($data));
}

function session_name($name = "")
{
    global $session;
    if(empty($name))
    {
        return($session->name);
    }
    $session->name = $name;
}

function session_set_save_handler($open, $close, $read, $write, $destr
oy, $gc)
{
    global $session, $user;
    
    $user = new user; 
    $user->open_func = $open;
    $user->close_func = $close;
    $user->read_func = $read;
    $user->write_func = $write;
    $user->destroy_func = $destroy;
    $user->gc_func = $gc;
    $session->mod_name = "user";
}

function session_module_name($name = "")
{
    global $session;
    
    if(empty($name))
    {
        return($session->mod_name);
    }
    $session->mod_name = $name;    
}

function session_save_path($path = "")
{
    global $session;
    
    if(empty($path))
    {
        return($session->save_path);
    }
    $session->save_path = $path;    
}

function session_id($id = "")
{
    global $session;
    
    if(empty($id))
    {
        return($session->id);
    }
    $session->id = $id;    
}

function session_register($var)
{
    global $session;
    
    if ($session->nr_open_sessions == 0)
    {
        session_start();
    }
    $session->vars[] = trim($var);
}

function session_unregister($var)
{
    global $session;
    
    for ($i=0; $i<count($session->vars); $i++)
    {
        if ($session->vars[$i] == trim($var))
           {
               unset($session->vars[$i]);
               break;
           }
    }
}

function session_is_registered($var)
{
    global $session;
    
    for ($i=0; $i<count($session->vars); $i++)
    {
        if ($session->vars[$i] == trim($var))
           {
               return(true);
           }
    }
    
    return(false);
}

function session_encode()
{
    global $session;
    
    $serializer = "_".$session->serialize_handler."_encode";
    $ret = $serializer();
    
    return($ret);
}

function session_decode($data)
{
    global $session;
    
    $serializer = "_".$session->serialize_handler."_decode";
    $ret = $serializer($data);
    
    return($ret);
}

function session_start()
{
    global $session, $SID, $HTTP_COOKIE_VARS;
    
    // Define the global variable $SID?
    $define_sid = true;
 
    // Check if session_start() has been called once already
    if ($session->nr_open_sessions != 0)
    {
        return(false);
    }

    // Try to get the session ID
    if (empty($GLOBALS[$session->name]))
    {
        // Maybe it is encoded into the URL (form <session-name>=<sess
ion-id>?
        eregi($session->name."=([^/]+)", $GLOBALS["REQUEST_URI"], $reg
s);
        $regs[1] = trim($regs[1]);
        if (!empty($regs[1]))
        {
            $session->id = $regs[1];
        }
    }
    else
    {
        $session->id =  $GLOBALS[$session->name];
        if (isset($HTTP_COOKIE_VARS[$session->name]))
        {
            $define_sid = false;
        }
    }

    // Check for external referer
    if ($session->extern_referer_check)
    {
        $url = parse_url($GLOBALS["HTTP_REFERER"]);
        if(trim($url["host"]) != $GLOBALS["SERVER_NAME"])
        {
            unset($session->id);
            $define_sid = true;
        }
    }   
   
    $mod = $GLOBALS[$session->mod_name];
    
    // Do we have an existing session ID?
    if (!empty($session->id))
    {
        // Start session
        if (!$mod->open($session->save_path, $session->name))
        {
            die("Failed to initialize session module.");
        }
        // Read session data
        if ($val = $mod->read($session->id))
        {   
            // Decode session data
            session_decode($val);
        }        
    }
    else 
    {
        // Create new session ID
        $session->id = _session_create_id();
        
        // Store cookie with this session ID?
        if ($session>use_cookies)
        {
            SetCookie($session->name, $session->id, $session->lifetime
);
        }
    }
    
    // Check if we should clean up (call the garbage collection routin
es)
    if ($session->gc_probability > 0)
    {
        srand(time());
        $randmax = getrandmax();
        $nrand = (int)(100 * rand() / $randmax);
        if($nrand < $session->gc_probability) 
        {
            $mod->gc($session->gc_maxlifetime);
        }
    }
    
    if($define_sid)
    {
        $SID = $session->name."=".$session->id;
    }
    $session->nr_open_sessions++;
    
    return(true);
}

function session_destroy()
{
    global $session;
    
    if($session->nr_open_sessions == 0)
    {
        return(false);
    }
    // Destroy session
    $mod = $GLOBALS[$session->mod_name];
    if (!$mod->destroy($session->name))
    {
        return(false);
    }    
    unset($session);
    $session = new session;

    return(true);
}

function session_close()
{
    global $session, $SID;
    
    if($session->nr_open_sessions == 0)
    {
        return(false);
    }
    // Encode session
    $val = session_encode();
    $len = strlen($val);

    // Save session
    $mod = $GLOBALS[$session->mod_name];
    if (!$mod->write($session->id, $val))
    {
        die("Session could not be saved.");
    }
    // Close session
    if (function_exists($session->mod_name."->close") &&!$mod->close()
)
    {
        die("Session could not be closed.");
    }
    $SID = "";
    $session->nr_open_sessions--;
    
    return(true);
}

$session = new session;
$mod = $session->save_handler;
$$mod = new $mod;

if ($session->auto_start)
{
    $ret = session_start() or die("Session could not be started.");
}
register_shutdown_function("session_close");

/*
 *      Basic Example
 *      
 *      This basic example shows the normal use. The code is the same 
as in 
 *      PHP 4, except for the require("sessions.php3");

require("sessions.php3");
session_start();
print("Our session ID is: ".session_id()."<br>");
print("The counter value is: $counter<br>");
print("The foo value is: $foo<br>");
$counter++;
$foo = "Foobar=Fobar";
session_register("counter");
session_register("foo");

 *
 */
  
/*
 *      User Callback Example
 *      
 *      This example uses callback functions. It's a slightly modified
 version
 *      of Sascha Schumann's original test script for the callbacks. 1
00%
 *      the same code as in PHP 4 (except for the require(), of course
).

require("sessions.php3");
function my_open($save_path, $sess_name)
{
    echo $save_path."<br>";
    echo $sess_name."<br>";
    return true;    
}
    
function my_read($sess_id)
{
    echo $sess_id."<br>";
    return true;
}
    
function my_write($sess_id, $val)
{
    echo $val."<br>";
    return true;    
}

$foo = 10;    
session_set_save_handler("my_open", "", "my_read", "my_write", "", "")
;
session_start();
session_register("foo");
echo "foo: $foo";

 *
 */
?>

--
oicq:1308221
email:[email protected]

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.134.77.43]

[关闭][返回]