Session 详解

分类: 互联网 > 其他

引子

一家咖啡店使用什么东西知道每一个客人点了什么东西呢?

  1. 桌子的号码

  2. 柜台本子

 

桌子的号码就是session的id

柜台的本子是客人不可以看到,也不可以随便更改的,这就服务器里保存的session文件

 


PHP里的Session

在php.ini里

session.save_handler = files

session.save_path = "c:\MyProgram\php\session"

session.use_cookies = 1

session.name = PHPSESSID

session.auto_start = 0

 

session的特点

同一session只允许同时一个请求打开,一个请求需要在前面的请求都完成了才会进行。

如何避开这个问题,让系统可以同时进行好几个请求呢?

 

session文件的删除机制

session.gc_probability = 1

session.gc_divisor = 1000

session.gc_maxlifetime = 1440


 

session三种存储方式应用:

<?php

function sessionByMem() {

    ini_set('session.save_handler', 'memcache');

    ini_set('session.save_path', '127.0.0.1:11211');

    session_start();

    if (!isset($_SESSION['mem_time'])) {

        $_SESSION['mem_time'] = time();

    }

    echo '<pre>';

    echo $_SESSION['mem_time'] . '<br />';

    $memcached = new Memcache();

    var_dump($memcached->addServer('127.0.0.1', 11211));

    var_dump($memcached->get(session_id()));

}

function sessionByRedis() {

    ini_set('session.save_handler', 'redis');

    ini_set('session.save_path', 'tcp://127.0.0.1:6379');

    session_start();

    if (!isset($_SESSION['redis_time'])) {

        $_SESSION['redis_time'] = time();

    }

    echo '<pre>';

    echo $_SESSION['redis_time'] . '<br />';

    $redis = new Redis();

    var_dump($redis->connect('127.0.0.1', 6379));

    var_dump($redis->get('PHPREDIS_SESSION:' . session_id()));

}

function sessionByFile() {

    ini_set('session.save_handler', 'file');

    session_start();

    if (!isset($_SESSION['file_time'])) {

        $_SESSION['file_time'] = time();

    }

    echo '<pre>';

    echo $_SESSION['file_time'] . '<br />';

    # /var/lib/php5

}

//sessionByMem();

//sessionByRedis();

sessionByFile();

 

session理解:

  1. session_start():开启session读取,一开启,$_SESSIION变量则被赋值,占用内存,直到程序运行结束才销毁

  2. session_register_shutdown():将自定义函数注册为关闭会话的函数。

  3. session_write_close():结束当前session并写入数据

  4. session_set_save_handler():重写session使用方法

  5. session_id:获取/设置当前会话 ID

  6. session_create_id:创建新的会话 ID

  7. session_regenerate_id:使用新生成的会话 ID 更新现有会话 ID

  8. PHP中session默认使用文件系统进行存储的,当进行读写session文件操作时,存储session的文件处于锁定状态,此时其他需要读写session数据的请求需要等待前一个请求完成后才会进行,从而导致PHP阻塞的发生

  9. redis可以解决拥塞的问题,memcache并不能解决拥塞的问题,具体问题不清楚

  10. session开启后,会读取session数据并在程序结束的时候,重新写入session里

 

测试程序:

<?php

class MySessionHandler implements SessionHandlerInterface

{

    function open($savePath, $sessionName) { }

    function close() { }

    function read($id) { }

    function write($id, $data) { echo 1;exit; }

    function destroy($id) { }

    function gc($maxlifetime) { }

}

$handler = new MySessionHandler();

session_set_save_handler(

    array($handler, 'open'),

    array($handler, 'close'),

    array($handler, 'read'),

    array($handler, 'write'),

    array($handler, 'destroy'),

    array($handler, 'gc')

);

session_start();

$_SESSION['test'] = 2;

echo date('Y-m-d H:i:s') . ':' . $_SESSION['test'];

 


 

利用session保存数据,cookie保存sessID来读取session数据

<?php

session_start();

session_name("GB_SID");

if ($_COOKIE[session_name()]) {

    session_id($_COOKIE[session_name()]);

} else {

    setcookie(session_name(), session_id(), time() + 86400 * 7, "/");

    $_SESSION['test11'] = '11';

}

 

来源:原创 发布时间:2020-12-18 22:13:03