# PHP中恢复session_ID来恢复上次有效会话

- Link: https://www.xuepaijie.com/html/skill/devops/578.html
- Published: 2016-03-10T16:52:38+08:00
- Author: Admin

在设计登录的模式时，会考虑到让SESSION能够独立于浏览器的行为，那也就是说不会因为关闭
了浏览器导致会话失效，这个时候肯定优先使用数据库来存储SESSION相关的内容。

php的session是可以程序恢复的，这个和java不太一样。session的恢复机制可以实现多个应用
程序session的共享，因为php的session都是以文件形式或者数据库存储的。首先是session_id
的获取是通过session_id()函数获取，这个值可以进行传递。

程序恢复session，首先要知道session_id，大家通过手册可以知道session的恢复通过session_id(
$id);但是在恢复时要注意一个先后顺序，要得到之前session的内容，必须在session_start()
之前执行session_id($id)，这样才能在执行了session_start时初始化session的时候恢复到
之前的内容，否则的话你得到的是一个空的session，你什么也得不到。之前session被重新
初始化了。这个和session_start()的作用有密切关系，因为session_start告诉php，session
要初始化，要从session文件中反序列化session内容，所以session_start的作用就是把之前
存储的文件内容反序列化。session_start序列化之前要知道session_id，如果没有就生成一个
新的session_id。如果有就反序列化相应文件的内容。

通过数据库来存储SESSION后，SESSION就变成了可控的，但是浏览器重新启动后，系统自动
分配的PHPSESSID是新的，这时候，我们就可以通过内置的函数来解决，如下，

**session_id()**

session_id() 存取目前 session 代号的一个内置函数。

语法： string session_id(string [id]);

本函数可取得或者重新配置目前存放 Session 的代号。若无参数 id 则表示只有取得目前 
Session 的代号，加上参数则表示将 Session 代号设成新指定的 id。输入及返回均为字符
串。

    ```html;
    输出 session_id()
    <?php
    session_start();

    echo session_id();
    // 输出 xxxxxxx
    ?>

    设置 session_id()
    <?php
    session_id("hello");
    session_start();

    echo session_id();
    // 输出 hello
    ?>
    ```
