同一个用户,同时打开多个PHP脚本调用session_start()时,会等待其他PHP脚本正在执行写入session的退出才能写入。正在使用同一会话时会锁定SESSION文件并独占使用的SESSION文件,第二个请求阻塞直到它完成写入并关闭才能进行,我们称为session阻塞。
PHP官方回复与我的想法差不多:
这不是一个错误。这是预期的,会话文件被锁定以避免损坏。
原理其实比较简单,PHP.ini默认情况下是将$_SESSION序列化后以文件的方式保存到硬盘中的,如果没有使用锁定,多个PHP脚本同时写入文件,就会出现错误的如果。
比如程序1要写入:
我是张三
程序2要写入:
我是李四
如果2个同时写入,将会出现:
我我是是张李三四
这样的情况,当然,这样写是方便理解,真实情况肯定比这个复杂,文件由于二进制码损坏直接是乱码的情况。所以PHP官方使用了排除阻塞的方式,按请求的先后顺序避免以上情况的发生。
了解了阻塞的原理,我们再来谈谈怎么解决这个问题(虽然发生的机率极低,同用户同一个浏览器同时打开多个脚本才有可能出现,根本硬盘的写入速度,时间极短,短到以毫秒计)。
官方提供了一个解决函数:
session_write_close();
写session的数据,同时关闭这个session。因此,我们可以在用完session之后,调用这个函数关闭session 文件即可解除锁定。一般,session是用来记录用户身份信息的,以便PHP进行身份认证,因此完全可以将session的读写放在页面刚开始执行的时 候,在执行完以后,马上调用session_write_close函数即可。
如果服务器环境支持Redis,可以将session写入到内存里,提升大大提升网站的性能并减少服务器的IO。参考:http://www.55mx.com/php/56.html
除非注明,网络人的文章均为原创,转载请以链接形式标明本文地址:https://www.55mx.com/post/58
《什么是PHP session阻塞,怎么避免出现session阻塞》的网友评论(0)