• session_id 生成原理


    PHPSESSID生成

    生成规则是根据hash_func散列来生成的,相关的参数有: 
    - 客户端IP 
    - 当前时间(秒) 
    - 当前时间(微妙) 
    - PHP自带的随机数生产器

    hash_func是phpinfo中的session.hash_function配置。如下:

    ; Select a hash function for use in generating session ids.
    ; Possible Values
    ;   0  (MD5 128 bits)
    ;   1  (SHA-1 160 bits)
    ; This option may also be set to the name of any hash function supported by
    ; the hash extension. A list of available hashes is returned by the hash_algos()
    ; function.
    ; http://php.net/session.hash-function
    session.hash_function=0

    PHP session工作原理

    以下以cookie传输PHPSESSID描述。 
    1. 客户端请求一个php的服务端地址。 
    2. 服务端收到请求,此次php脚本中包含session_start()。 
    3. 服务端会生成一个PHPSESSID。(默认session存储方式为session.save_handler=files,文件形式存储。生成的session文件名规则即为sess_PHPSESSID,session文件存在session.save_path中。) 
    4. 服务端响应首部Response Headers:Set-Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50; path=/。在客户端生成一个cookie保存此PHPSESSID。 
    5. 此时,客户端的cookie里面包含了PHPSESSID,之后客户端的每次请求首部Request Headers:Cookie:PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50。服务端之后每次接收到客户端的请求就都能根据这个PHPSESSID来找到服务端的session文件,通过对这个session文件的读写操作即实现了session的超全局变量属性。

    如果客户端禁用了cookie,由于无法使用cookie传递PHPSESSID,那么客户端每次请求,服务端都会重新建立一个session文件,而无法通过通过PHPSESSID来重用session文件,所以session也就失效了。 
    这种情况可以设置session.use_trans_sid来传输PHPSESSID,具体实现方式与cookie的区别就是将PHPSESSID通过HTTP的GET传输。每次请求的地址里面都会补全PHPSESSID参数”url?PHPSESSID=37vjjasgjdv2ouk1uomhgqkv50”来实现。

    PHPcli模式通过session_id()使用session

    官网说明 
    可以通过它来获取当前会话的PHPSESSID,也可以通过它来设置当前的会话PHPSESSID。 
    PHPcli模式下可以通过设置这个,达到使用session的目的,非常方便。 
    例如:

    <?php
    // session_id('vingbrv8m64asth0nhplu9gmb7');
    session_start();
    $_SESSION[md5(rand(100,999))] = rand(100,999);
    var_dump($_SESSION);

    未使用session_id()的时候,在cli模式下运营此php脚本三次: 
    这里写图片描述 
    可以看到由于cli模式下没有传输PHPSESSID,所以每次都是一次性的session使用。session没有生效。 
    查看下session文件: 
    这里写图片描述 
    这三个session文件是我们三次cli执行生成的。三个session文件的内容如下: 
    这里写图片描述 
    这里写图片描述 
    这里写图片描述

    将之前的session文件删除掉,然后如果我们使用session_id(),为cli脚本设定固定的PHPSESSID。

    <?php
    session_id('vingbrv8m64asth0nhplu9gmb7');
    session_start();
    $_SESSION[md5(rand(100,999))] = rand(100,999);
    var_dump($_SESSION);

    然后cli运行脚本三次: 
    这里写图片描述 
    再查看下session文件,就只有一个我们设置的session文件: 
    这里写图片描述 
    文件内容: 
    这里写图片描述

    在服务器端生成的session_id  会通过相应头部分,写入到浏览器中

    Set-Cookie ECSCP[admin_id]=1; expires=Sun…T; Max-Age=31536000; httponly
    Set-Cookie ECSCP[admin_pass]=a8e22f0c201b…T; Max-Age=31536000; httponly

    往浏览器中 写入两个cookie

  • 相关阅读:
    PHP定时备份MySQL,mysqldump语法大全
    虚拟机拷贝之后,发现系统内的开机自启动的nginx,不能自启动了
    八:二叉搜索树的后序遍历
    配置Ubuntu开发环境
    poj 1147 Binary codes
    test
    Python标准库:内置函数reversed(seq)
    Matplotlib 工具包 使用教程索引
    6大设计原则(1):单一职责原则
    hdu 4104
  • 原文地址:https://www.cnblogs.com/hehexu/p/9458572.html
Copyright © 2020-2023  润新知