天天看點

PHP中使用者自定義Session處理機制

*session_start() 會觸發open(),read() 

session_commit()以及頁面執行完畢都會順序觸發 write(),close()*

自定義Session處理機制首先要設定php.ini選項session.save_handler = user,也可在 PHP程式 中進行設定:ini_set(‘session.save_handler’, ‘user’); 

注意一定要把 “session.auto_start = 1 改成 session.auto_start = 0 ,不然設定ini_set(‘session.save_handler’, ‘user’);會引起報錯。

接下來着重看 session_set_save_handle() 函數,此函數有六個參數: 

<?php
class FileSessionHandler
{
    private $savePath;
    //第一個參數$save_path對應的是ini_get('session.save_path')
    //第二個參數$name對應的是ini_get('session.name')
    function open($savePath, $sessionName)
    {
        $this->savePath = $savePath;
        if (!is_dir($this->savePath)) {
            mkdir($this->savePath, 0777);
        }

        return true;
    }

    function close()
    {
        return true;
    }

    function read($id)
    {
        return (string)@file_get_contents("$this->savePath/sess_$id");
    }

    function write($id, $data)
    {
        return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
    }

    function destroy($id)
    {
        $file = "$this->savePath/sess_$id";
        if (file_exists($file)) {
            unlink($file);
        }

        return true;
    }

    function gc($maxlifetime)
    {
        foreach (glob("$this->savePath/sess_*") as $file) {
            if (filemtime($file) + $maxlifetime < time() && file_exists($file)) {
                unlink($file);
            }
        }

        return true;
    }
}

$handler = new FileSessionHandler();
session_set_save_handler(
    array($handler, 'open'),
    array($handler, 'close'),
    array($handler, 'read'),
    array($handler, 'write'),
    array($handler, 'destroy'),
    array($handler, 'gc')
    );

// the following prevents unexpected effects when using objects as save handlers
register_shutdown_function('session_write_close');