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 相关文章推荐
PHP静态新闻列表自动生成代码
Jun 14 PHP
解析php中call_user_func_array的作用
Jun 07 PHP
解析php类的注册与自动加载
Jul 05 PHP
怎么在Windows系统中搭建php环境
Aug 31 PHP
php后台如何避免用户直接进入方法实例
Oct 15 PHP
PHP定时执行任务实现方法详解(Timer)
Jul 30 PHP
php实现json编码的方法
Jul 30 PHP
PHP中让json_encode不自动转义斜杠“/”的方法
Feb 28 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
Mar 15 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
Mar 28 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
php实现根据身份证获取精准年龄
Feb 26 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中的filesystem文件系统函数介绍及使用示例
2014/02/13 PHP
php使用cookie显示用户上次访问网站日期的方法
2015/01/26 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
php blowfish加密解密算法
2016/07/02 PHP
Laravel下生成验证码的类
2017/11/15 PHP
PHP设计模式之观察者模式定义与用法分析
2019/04/04 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
javascript 混合的构造函数和原型方式,动态原型方式
2009/12/07 Javascript
javascript Object与Function使用
2010/01/11 Javascript
node.js中的fs.chmod方法使用说明
2014/12/18 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
基于vue实现多引擎搜索及关键字提示
2017/03/16 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
2017/10/31 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
跟老齐学Python之让人欢喜让人忧的迭代
2014/10/02 Python
python实现m3u8格式转换为mp4视频格式
2018/02/28 Python
numpy matrix和array的乘和加实例
2018/06/28 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
python 实现图片旋转 上下左右 180度旋转的示例
2019/01/24 Python
Python中的asyncio代码详解
2019/06/10 Python
Python容器使用的5个技巧和2个误区总结
2019/09/26 Python
Python csv文件的读写操作实例详解
2019/11/19 Python
python如何求100以内的素数
2020/05/27 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题
2021/01/19 HTML / CSS
eBay法国购物网站:eBay.fr
2017/10/21 全球购物
韩国流行时尚女装网站:Dintchina(中文)
2018/07/19 全球购物
应聘教师自荐信
2013/10/12 职场文书
大一自我鉴定范文
2013/12/27 职场文书
儿媳婚宴答谢词
2014/01/14 职场文书
保卫钓鱼岛口号
2014/06/20 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书
小学体育组工作总结
2015/08/13 职场文书
解决python存数据库速度太慢的问题
2021/04/23 Python
golang http使用踩过的坑与填坑指南
2021/04/27 Golang