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动态生成虚拟现实VRML网页
Oct 09 PHP
php array_map()数组函数使用说明
Jul 12 PHP
PHP内置过滤器FILTER使用实例
Jun 25 PHP
php微信支付之APP支付方法
Mar 04 PHP
php使用Jpgraph绘制3D饼状图的方法
Jun 10 PHP
PHP命名空间和自动加载类
Apr 03 PHP
php rmdir使用递归函数删除非空目录实例详解
Oct 20 PHP
详解PHP中foreach的用法和实例
Oct 25 PHP
详解yii2实现分库分表的方案与思路
Feb 03 PHP
如何打开php的gd2库
Feb 09 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
May 23 PHP
CI框架简单分页类用法示例
Jun 06 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
让你的网站首页自动选择语言转跳
2006/12/06 PHP
一些被忽视的PHP函数(简单整理)
2010/04/30 PHP
php实现json编码的方法
2015/07/30 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
2016/08/12 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
Javascript图像处理—为矩阵添加常用方法
2012/12/27 Javascript
jQuery在ul中显示某个li索引号的方法
2015/03/17 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
JS中取二维数组中最大值的方法汇总
2016/04/17 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
微信小程序scroll-view实现字幕滚动
2018/07/14 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
2019/11/04 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
[02:00]DOTA2英雄COSPLAY闹市街头巡游助威2015国际邀请赛
2015/08/02 DOTA
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
使用Python获取Linux系统的各种信息
2014/07/10 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
2016/09/18 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
django celery redis使用具体实践
2019/04/08 Python
python3 selenium自动化测试 强大的CSS定位方法
2019/08/23 Python
使用django和vue进行数据交互的方法步骤
2019/11/11 Python
Python如何读写二进制数组数据
2020/08/01 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
利用Storage Event实现页面间通信的示例代码
2018/07/26 HTML / CSS
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
iHerb俄罗斯:维生素、补品和天然产品
2020/07/09 全球购物
中层干部岗位职责
2013/12/18 职场文书
教师绩效考核方案
2014/01/21 职场文书
红色故事演讲稿
2014/05/22 职场文书
教师节倡议书
2014/08/30 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
网吧管理制度范本
2015/08/05 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书