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 相关文章推荐
Win2000+Apache+MySql+PHP4+PERL安装使用小结
Oct 09 PHP
PHP备份数据库生成SQL文件并下载的函数代码
Feb 05 PHP
php伪静态之APACHE篇
Jun 02 PHP
PHP延迟静态绑定示例分享
Jun 22 PHP
php采用curl实现伪造IP来源的方法
Nov 21 PHP
PHP中的Session对象如何使用
Sep 25 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
Dec 19 PHP
Yii数据读取与跳转参数传递用法实例分析
Jul 12 PHP
PHP带节点操作的无限分类实现方法详解
Nov 09 PHP
总结的一些PHP开发中的tips(必看篇)
Mar 24 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 PHP
PHP创建XML接口示例
Jul 04 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 8小时时间差的解决方法小结
2009/12/22 PHP
PHP中foreach循环中使用引用要注意的地方
2011/01/02 PHP
php检测iis环境是否支持htaccess的方法
2014/02/18 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
js右键菜单效果代码
2007/07/21 Javascript
script标签的 charset 属性使用说明
2010/12/04 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
javascript面向对象包装类Class封装类库剖析
2013/01/24 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
javascript 树形导航菜单实例代码
2013/08/13 Javascript
解析Javascript小括号“()”的多义性
2013/12/03 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
2015/03/05 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
2017/09/01 Javascript
基于JavaScript 性能优化技巧心得(分享)
2017/12/11 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
Vue 幸运大转盘实现思路详解
2019/05/06 Javascript
Python使用Turtle模块绘制五星红旗代码示例
2017/12/11 Python
matplotlib调整子图间距,调整整体空白的方法
2018/08/03 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
2019/05/31 Python
pyqt5 删除layout中的所有widget方法
2019/06/25 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
2019/07/31 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
浅析Python 条件控制语句
2020/07/15 Python
Python 高效编程技巧分享
2020/09/10 Python
阿迪达斯奥地利官方商城:adidas.at
2016/10/16 全球购物
仓库门卫岗位职责
2013/12/22 职场文书
白酒业务员岗位职责
2013/12/27 职场文书
酒店总经理欢迎词
2014/01/08 职场文书
2014年五一促销活动方案
2014/03/09 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
瘦西湖导游词
2015/02/03 职场文书
《窃读记》教学反思
2016/02/18 职场文书
《女娲补天》教学反思
2016/02/20 职场文书
原来实习报告是这样写的呀!
2019/07/03 职场文书