SESSION的操作有哪些?
对于PHP程序员来说,应该对session都不陌生,我们知道,关于SESSION的操作和数据库一样,有读取、写入、修改、删除,也就是说,对于一个SESSION会话,估计会有很多地方在写、很多地方再读,而且还不能够确定是读在前还是写在前。
引入锁的原因
上面已经分析了,对于同一个会话,如果没有锁的引入,我们会发现有可能读取的数据是修改之前的数据,而不是修改之后的数据,这样使用修改之前的数据进行一些操作,势必会引入很多数据不一致的问题,尤其涉及用户财产安全的数据,这种情况其实和数据库一样,而数据库是使用事务来处理,而PHP是使用锁来处理,就是锁定相应的SESSION文件。
引入锁之后会发生什么
看看上面的代码,我们首先开启会话,然后读取数据库里面某个用户的用户名,然后将这个用户名赋予SESSION变量,然后休眠1000秒钟,我们知道,对于PHP默认情况下,如果一个PHP脚本结束了,SESSION对话就自动关闭了,现在由于休眠,所以SESSION对话没有关闭,导致我们打开选项卡访问另一个有SESSION操作的页面时,页面一直等待一直转圈圈。
怎么快速释放相应的锁
上面我们已经模拟了一种session锁的情况,这种情况其实就是描述了一种生产环境的情况,就是后面的代码需要执行的时间很长,那么面对这种情况,我们可以采用提前关闭结束SESSION会话的方式来解决锁等待的问题。
在PHP7之前,我们可以用session_write_close函数来关闭,这种关闭不管是读取还是写入会话、更新等等都有效,不过在PHP7中专门针对读取引入了read_and_close这个,我们可以在开启会话的时候指定这个选项,这样对于读取类的会话就不用我们手动关闭了。
不知道大家发现没有,关于SESSION的锁这些知识非常像我们的数据库,只不过默认情况下,是用文件锁来完成事务的相关功能。
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~