session_start() 慢日志 php缺陷 几种处理方案

2019/10/10 17:37 于 技术 0

很多人为此所困,毕业后就懒得写东西了,说一下原因和几种解决方案

不是session_start这个函数的问题,不要在这里找原因,这个是php的一个设计缺陷(说不定设计时有什么咱不知道的用意呢,在此处以为是缺陷)

以下前提为,php的session的保存方案为文件,如果为mysql或memcached,那就不用往下看了,应该是你的mysql或memcached问题需要优化

原因是“阻塞”

自己了解一个进程线程知识里面的这个词的相关知识,不知道台湾那边怎么起名

一次会话(某一个时间段下同一浏览器里同一个域名的页面)一个session,通常以session_id为文件名保存session内容,存到session文件目录下。
调用session_start(),读取session文件内容到$_SESSION中,脚本在执行过程中,可能会写入$_SEESION[k]=v,脚本执行结束,将$_SESSION变量写入到session文件中,保存文件。
问题在于,从打开到写入的过程中,文件是被锁定的(了解一下c语言的原始文件读写方式)。

近年来多种vue react类框架的使用,各种数据同时通过ajax请求加载,同一个会话的某一时刻,多个线程或进程要访问同一个session文件,这种情况就这个必须等他之前的脚本执行结束,session_start()才执行结束。那如果其中一个脚本卡了呢(如果你的脚本和sql没有太烂,那经常会卡到读取远程文件上,总之肯定要卡的)?那后面的请求,必须等这个卡的脚本卡完才能开始执行,后面的都得先卡着。就这么回事。

要根据你的业务,和你的代码混乱程度来选择解决方案。我写几种方案自己选。

可选方案

php7给了一个参数

如果你的版本是php5就不要考虑这种了
session_start (['read_and_close'  => true] ) 

session_commit/session_write_close

这俩函数是同一个函数。调用后,$_SESSION可以读,内容没有问题,但是写就不能写了,写了没效果,如果要写,要先session_start()一下,写完再session_commit,别影响其他脚本的session_start

你对你的业务了如指掌,代码经过几年改改改又烂的不行,知道就几个地方会卡的话,可以在卡前session_commit,卡后需要写了再session_start

自己写个session操作类,写的时候先session_start,写完后session_commit一下,这种情况用于代码比较规整干净好实施的情况

换session.savehandler

发表评论
已登录为 [退出]