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

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

不是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值