PHP中Session引起的脚本阻塞问题解决办法


Posted in PHP onApril 08, 2014

解决session阻塞问题的办法:在session操作完成后调用session_write_close()即可避免此问题;

案例一:

使用session过程中,在开启session后,同一浏览器,执行同一程序,不同页面会被锁。不同浏览器不会出现这种情况。

  疑问:是不是session_start导致了阻塞?

   于是,我写了几个页面测试了一下,发现是session导致了阻塞,而其他两种情况不会造成阻塞。

   查了下PHP的Bug列表,发现有人提出了这个问题:

Description:
------------
Calling session_start() appears to wait until other scripts have exited
that are using the same session. My guess is the 1st request locks the 
session file for exclusive use, and the second request blocks until it 
can open it.

    PHP官方的回复是:

Thank you for taking the time to write to us, but this is not a bug.This is expected, the session file is locked to avoid corruption.

    结合了PHP的Session机制,找到了阻塞的原因。由于PHP的Session信息是写入文件的,1个客户端占有1个session文件。因此,当 session_start被调用的时候,该文件是被锁住的,而且是以读写模式锁住的(因为程序中可能要修改session的值),这样,第2次调用 session_start的时候就被阻塞了。

    最简解决方法:

    查了PHP的手册,发现一个session_write_close函数,作用是Write session data and end session,也就是写session的数据,同时关闭这个session。因此,我们可以在用完session之后,调用这个函数关闭session 文件即可解除锁定。一般,session是用来记录用户身份信息的,以便PHP进行身份认证,因此完全可以将session的读写放在页面刚开始执行的时 候,在执行完以后,马上调用session_write_close函数即可。

案例二:

上回说要改opencart其实是给opencart加一个抓取淘宝上的产品的功能,但是弄完后发现一个问题,就是当脚本在抓取的时候,因为这个过程比较慢,这个时候其他所有脚本的执行都被阻塞了,直到抓取完其他脚本才能依次执行。研究了半天没有结果,在知乎上问了下可能是session的问题,需要调用session_write_close()来解决,那么这个session_write_close()是干嘛用的呢,手册上这样写的:

结束当前session,保存session数据。
session数据通常会在脚本执行结束后被保存而并不需要调用session_write_close(),但是为保护session在任何时候都只能被一个脚本执行写操作,session的数据会被锁住。当同时使用框架网页和session时你会发现,框架里的网页会因为这个个锁定而逐个载入。你可以通过在所有的session数据修改保存结束后马上结束session来加快载入时间。

这就很好的解释了为什么我的抓取脚本会阻塞其他页面的原因。所以,如果你有一个需要执行时间比较长并用到session的ajax请求的话,就需要在服务器端调用session_write_close(),不然你的其他页面就都会被挂起直到请求结束!!!

 

PHP 相关文章推荐
在数据量大(超过10万)的情况下
Jan 15 PHP
ThinkPHP中实例Model方法的区别说明
Aug 21 PHP
为PHP初学者的8点有效建议
Nov 20 PHP
浅析php变量作用域的一些问题
Aug 08 PHP
PHP empty函数报错解决办法
Mar 06 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
Apr 30 PHP
smarty缓存用法分析
Dec 16 PHP
php实现的简单美国商品税计算函数
Jul 13 PHP
YII Framework框架教程之缓存用法详解
Mar 14 PHP
PHP的反射机制实例详解
Mar 29 PHP
php下载远程大文件(获取远程文件大小)的实例
Jun 17 PHP
PHP+redis实现的悲观锁机制示例
Jun 12 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
Apr 08 #PHP
PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
Apr 08 #PHP
php实现telnet功能示例
Apr 08 #PHP
C#使用PHP服务端的Web Service通信实例
Apr 08 #PHP
php实现水仙花数的4个示例分享
Apr 08 #PHP
php命令行使用方法和命令行参数说明
Apr 08 #PHP
php实现httpclient类示例
Apr 08 #PHP
You might like
PHP小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
php多次include后导致全局变量global失效的解决方法
2015/02/28 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
通过Unicode转义序列来加密,按你说的可以算是混淆吧
2007/05/06 Javascript
jquery $.getJSON()跨域请求
2011/12/21 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
2016/05/15 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
Vuex之理解Mutations的用法实例
2017/04/19 Javascript
JS验证全角与半角及相互转化的介绍
2017/05/18 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
vue select二级联动第二级默认选中第一个option值的实例
2018/01/10 Javascript
jquery应用实例分享_实现手风琴特效
2018/02/01 jQuery
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
详解vue组件开发脚手架
2018/06/15 Javascript
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
2018/07/30 Javascript
详解一些适用于Node.js的命名约定
2019/12/08 Javascript
uni-app 组件里面获取元素宽高的实现
2019/12/27 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
Python标准库defaultdict模块使用示例
2015/04/28 Python
python 输出上个月的月末日期实例
2018/04/11 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
Python实现随机爬山算法
2021/01/29 Python
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
新加坡交友网站:be2新加坡
2019/04/10 全球购物
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
2014/11/09 面试题
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
高中运动会入场词
2014/02/14 职场文书
检查机关党的群众路线个人整改措施
2014/10/04 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
质量整改通知单
2015/04/21 职场文书
高中运动会广播稿
2015/08/19 职场文书
人生一定要学会的三样东西:放下、忘记、珍惜
2019/08/21 职场文书
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python