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或asp创建网页桌面快捷方式的代码
Mar 23 PHP
php入门学习知识点三 PHP上传
Jul 14 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
Apr 02 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
Jan 29 PHP
使用PHP实现Mysql读写分离
Jun 28 PHP
thinkphp3.2.2前后台公用类架构问题分析
Nov 25 PHP
彻底删除thinkphp3.1案例blog标签的方法
Dec 05 PHP
php获取QQ头像并显示的方法
Dec 23 PHP
7个鲜为人知却非常实用的PHP函数
Jul 01 PHP
PHP设计模式之模板模式定义与用法详解
Dec 20 PHP
PHP小程序支付功能完整版【基于thinkPHP】
Mar 26 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
May 02 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判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
laravel使用数据库测试注意事项
2020/04/10 PHP
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
jquery插件如何使用 jQuery操作Cookie插件使用介绍
2012/12/15 Javascript
jquery鼠标滑过提示title具体实现代码
2013/08/06 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
2014/07/31 Javascript
javascript通过元素id和name直接取得元素的方法
2015/04/28 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
表单验证正则表达式实例代码详解
2015/11/09 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
node.js(express)中使用Jcrop进行图片剪切上传功能
2017/04/21 Javascript
关于javascript获取内联样式与嵌入式样式的实例
2017/06/01 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
详解jQuery中的getAll()和cleanData()
2019/04/15 jQuery
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
微信网页登录逻辑与实现方法
2019/04/29 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
python使用三角迭代计算圆周率PI的方法
2015/03/20 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
Python2实现的图片文本识别功能详解
2018/07/11 Python
Pycharm无法使用已经安装Selenium的解决方法
2018/10/13 Python
Python3.5基础之NumPy模块的使用图文与实例详解
2019/04/24 Python
Python可迭代对象操作示例
2019/05/07 Python
python自动化测试之DDT数据驱动的实现代码
2019/07/23 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
2020/03/14 Python
详解Python流程控制语句
2020/10/28 Python
使用Python爬取Json数据的示例代码
2020/12/07 Python
使用CSS3制作响应式导航菜单的方法
2015/07/12 HTML / CSS
英国在线购买轮胎、预订汽车、汽车维修和装配网站:Protyre
2020/04/12 全球购物
《母亲的恩情》教学反思
2014/02/13 职场文书
《孔子游春》教学反思
2014/02/25 职场文书
自我评价优缺点范文
2015/03/11 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP