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 相关文章推荐
使用apache模块rewrite_module (转)
Feb 14 PHP
Win2003服务器安全加固设置--进一步提高服务器安全性
May 23 PHP
PHP5 面向对象程序设计
Feb 13 PHP
php 获取mysql数据库信息代码
Mar 12 PHP
PHP Zip解压 文件在线解压缩的函数代码
May 26 PHP
PHP 时间日期操作实战
Aug 26 PHP
Redis使用Eval多个键值自增的操作实例
Nov 04 PHP
PHP 实现从数据库导出到.csv文件方法
Jul 06 PHP
PHP魔术方法之__call与__callStatic使用方法
Jul 23 PHP
php删除二维数组中的重复值方法
Mar 12 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 PHP
PHP rsa加密解密算法原理解析
Dec 09 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使用array_merge重新排列数组下标的方法
2015/07/22 PHP
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
JS 时间显示效果代码
2009/08/23 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
js获取内联样式的方法
2015/01/27 Javascript
JSONObject使用方法详解
2015/12/17 Javascript
JavaScript绑定事件监听函数的通用方法
2016/05/14 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
2017/01/12 Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
2017/06/28 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
2018/08/27 Javascript
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
JavaScript变量作用域及内存问题实例分析
2019/06/10 Javascript
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
Python的高级Git库 Gittle
2014/09/22 Python
Python中的类学习笔记
2014/09/23 Python
解读Python编程中的命名空间与作用域
2015/10/16 Python
如何用itertools解决无序排列组合的问题
2017/05/18 Python
python爬取个性签名的方法
2018/06/17 Python
python飞机大战pygame游戏之敌机出场实现方法详解
2019/12/17 Python
python 日志 logging模块详细解析
2020/03/31 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
汉森冲浪板:Hansen Surfboards
2018/05/19 全球购物
日本热销NO.1胶原蛋白冻:Aishitoto爱希特多
2019/06/20 全球购物
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
杜甫草堂导游词
2015/02/03 职场文书
2019年最新证婚词精选集!
2019/06/28 职场文书
python实现求纯色彩图像的边框
2021/04/08 Python
SQL Server中的逻辑函数介绍
2022/05/25 SQL Server