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 相关文章推荐
获得Google PR值的PHP代码
Jan 28 PHP
php header功能的使用
Oct 28 PHP
ThinkPHP CURD方法之limit方法详解
Jun 18 PHP
php与flash as3 socket通信传送文件实现代码
Aug 16 PHP
PHP文件读写操作相关函数总结
Nov 18 PHP
PHP中捕获超时事件的方法实例
Feb 12 PHP
php字符串函数学习之strstr()
Mar 27 PHP
Smarty模板变量调节器用法分析
May 23 PHP
ThinkPHP开发--使用七牛云储存
Sep 14 PHP
实例解析php的数据类型
Oct 24 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
May 27 PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
Aug 13 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输出echo、print、print_r、printf、sprintf、var_dump的区别比较
2013/06/21 PHP
php实现的日历程序
2015/06/18 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
jquery dialog键盘事件代码
2010/08/01 Javascript
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
JavaScript改变CSS样式的方法汇总
2015/05/07 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
Bootstrap导航条学习使用(二)
2017/02/08 Javascript
解决webpack -p压缩打包react报语法错误的方法
2017/07/03 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
nodejs前端模板引擎swig入门详解
2018/05/15 NodeJs
jQuery插件实现非常实用的tab栏切换功能【案例】
2019/02/18 jQuery
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
编写v-for循环的技巧汇总
2020/12/01 Javascript
[43:47]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第一场 12.09
2020/12/11 DOTA
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
python基础练习之几个简单的游戏
2017/11/10 Python
Flask框架Flask-Principal基本用法实例分析
2018/07/23 Python
Python基于pyecharts实现关联图绘制
2020/03/27 Python
Python虚拟环境venv用法详解
2020/05/25 Python
python speech模块的使用方法
2020/09/09 Python
Python操作Excel的学习笔记
2021/02/18 Python
加拿大床上用品、家居装饰、厨房和浴室产品购物网站:Linen Chest
2018/06/05 全球购物
教师竞聘演讲稿
2014/05/16 职场文书
党员对照检查材料思想汇报
2014/09/16 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
党员评议自我评价
2015/03/03 职场文书
余世维讲座观后感
2015/06/11 职场文书
教师节主题班会教案
2015/08/17 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
Python函数对象与闭包函数
2022/04/13 Python
GTX1660显卡搭配显示器推荐
2022/04/19 数码科技