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 相关文章推荐
Search Engine Friendly的URL设计
Oct 09 PHP
Dedecms V3.1 生成HTML速度的优化办法
Mar 18 PHP
php header()函数使用说明
Jul 10 PHP
php算开始时间到过期时间的相隔的天数
Jan 12 PHP
php实例分享之html转为rtf格式
Jun 02 PHP
php站内搜索关键词变亮的实现方法
Dec 30 PHP
PHP打印输出函数汇总
Aug 28 PHP
关于php 高并发解决的一点思路
Apr 16 PHP
Ajax中的JSON格式与php传输过程全面解析
Nov 14 PHP
thinkPHP框架实现的无限回复评论功能示例
Jun 09 PHP
phpstorm 配置xdebug的示例代码
Mar 31 PHP
Laravel实现ORM带条件搜索分页
Oct 24 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
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
PHP程序61条面向对象分析设计的经验小结
2008/11/12 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
PHP针对常规模板引擎中与CSS/JSON冲突的解决方法
2014/08/19 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
php从数据库读取数据,并以json格式返回数据的方法
2018/08/21 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
JavaScript设计模式之原型模式(Object.create与prototype)介绍
2014/12/28 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
2015/08/06 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
2015/11/05 Javascript
学习AngularJs:Directive指令用法(完整版)
2016/04/26 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
Node做中转服务器转发接口
2017/10/18 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
2019/08/29 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
python检测某个变量是否有定义的方法
2015/05/20 Python
python中redis的安装和使用
2016/12/04 Python
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
Python模块、包(Package)概念与用法分析
2019/05/31 Python
python把ipynb文件转换成pdf文件过程详解
2019/07/09 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
2019/09/05 Python
python返回数组的索引实例
2019/11/28 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
2014三八妇女节活动总结范文四篇
2014/03/09 职场文书
优质服务演讲稿
2014/05/14 职场文书
幽默自我介绍演讲稿
2014/08/21 职场文书
岳麓书院导游词
2015/02/03 职场文书
个人总结怎么写
2015/02/26 职场文书
少年雷锋观后感
2015/06/10 职场文书
2016年优秀少先队员事迹材料
2016/02/26 职场文书
运动会主持人开幕词
2016/03/04 职场文书
创业计划书之家教中心
2019/09/25 职场文书