资讯专栏INFORMATION COLUMN

我所理解的session_set_save_handler的执行顺序机制

snowLu / 418人阅读

摘要:改变默认回调顺序那么我们使用或者函数调用的时候,的机制就改变了,直接写入文件,关闭文件。然后再执行脚本。可能和我的平台有关系。另外的相关也可参考该问题已经澄清,请移步机制下在下与是不同的。


默认的session handler启动顺序
savePath = $savePath;
        if (!is_dir($this->savePath)) {
            mkdir($this->savePath, 0777);
        }

        echo __FUNCTION__."
"; return true; } function close() { echo __FUNCTION__."
"; return true; } function read($id) { echo __FUNCTION__."
"; return (string)@file_get_contents("$this->savePath/sess_$id"); } function write($id, $data) { echo __FUNCTION__."
"; 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); } echo __FUNCTION__."
"; return true; } function gc($maxlifetime) { foreach (glob("$this->savePath/sess_*") as $file) { if (filemtime($file) + $maxlifetime < time() && file_exists($file)) { unlink($file); } } echo __FUNCTION__."
"; return true; } function end(){ echo "我是最后脚本结束register_shutdown_functiond调用"."
"; } } $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") ); // 下面这行代码可以防止使用对象作为会话保存管理器时可能引发的非预期行为 register_shutdown_function(array($handler,end)); session_start(); $_SESSION["name"]="tb"; // session_commit(); // session_write_close(); // 如果开启,那顺序就是open read (gc) write close // session_destroy(); // session_regenerate_id(true);

运行后如下图所示:

默认是session_start分别调用的回调函数。为open read ,然后等待脚本结束,收集$_SESSION(默认在内存中),然后关闭脚本,然后执行write,写入文件,然后close。

改变默认session回调顺序

那么我们使用 session_commit(); 或者 session_write_close();函数调用的时候,session的机制就改变了,直接写入文件,关闭文件。然后再执行脚本。如下图所示:

那么session_dessory调用的时候,就是在read之后,因为只要sesson_start开启,先执行的就是open 和read。
那么gc呢,我们都知道gc是根据 session.gc_probabilitysession.gc_divisor 参数控制。本例中我设置了他们的比例为5,但是现在的问题是我刷新5+次可能也调用不了一次gc。可能和我的win平台有关系。如果命中gc,而且没有调用 session_commit(); 或者 session_write_close();函数,运行流程如下图所示:

在win平台的遗留问题(已经测试解决)

ps:由于都是在win上测试,可能对gc的回收不是很准确,包括即使我设置为1:1,百分之百回收。在win上仍然存在这个sessionid文件,可能原因是session 锁机制,我在linux上测试了再分享给大家。
另外session的相关也可参考
该问题已经澄清,请移步php Session gc机制下在window下与ununtu是不同的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21052.html

相关文章

  • 详解Session

    摘要:会在脚本执行完毕或调用函数之后调用此回调函数。此回调函数操作成功返回,反之返回。在回调函数中,以传入的作为,以的值作为中的值存入,并设置过期时间为秒方法以传入的为从取出相应的的值。 1 Session的基本概念和设置 Session存储在服务端,本质上和Cookie没有区别,都是针对http协议的局限性而提出的一种保持客户端和服务端间会话状态的机制。Session经常用来网站的上下文间...

    joy968 评论0 收藏0
  • Sessions共享技术设计

    摘要:方法销毁大于给定的所有数据,对本身拥有过期机制的系统如和而言,该方法可以留空。注意事项浏览器标签脚本执行过程中,打开标签访问同一个脚本,会被,直到执行完毕。 概述 分布式session是实现分布式部署的前提, 当前项目由于历史原因未实现分布式session, 但是由于在kubernets中部署多个pod时, 负载均衡的调用链太长, 导致会话不能保持, 所以迫切需要分布式session....

    RdouTyping 评论0 收藏0
  • 今天,我明白了JS事件循环机制

    摘要:而这些队列由的事件循环来搞定宏任务与微任务,在最新标准中,它们被分别称为与。我们梳理一下事件循环的执行机制循环首先从宏任务开始,遇到,生成执行上下文,开始进入执行栈,可执行代码入栈,依次执行代码,调用完成出栈。 写在前面 js是一门单线程的编程语言,也就是说js在处理任务的时候,所有任务只能在一个线程上排队被执行,那如果某一个任务耗时比较长呢?总不能等到它执行结束再去执行下一个。所以在...

    maochunguang 评论0 收藏0

发表评论

0条评论

snowLu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<