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自动跳转中英文页面
Jul 29 PHP
深入理解PHP原理之Session Gc的一个小概率Notice
Apr 12 PHP
说说PHP的autoLoad自动加载机制
Sep 27 PHP
解析smarty 截取字符串函数 truncate的用法介绍
Jun 20 PHP
destoon二次开发模板及调用语法汇总
Jun 21 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
Aug 18 PHP
学习php设计模式 php实现工厂模式(factory)
Dec 07 PHP
PHP编写登录验证码功能 附调用方法
May 19 PHP
详解php实现页面静态化原理
Jun 21 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
May 10 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
Jul 12 PHP
laravel 执行迁移回滚示例
Oct 23 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二维数组的去重问题解析
2011/07/17 PHP
php中常用字符串处理代码片段整理
2011/11/07 PHP
浅谈COOKIE和SESSION区别
2015/07/19 PHP
php使用escapeshellarg时中文被过滤的解决方法
2016/07/10 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
JavaScript函数、方法、对象代码
2008/10/29 Javascript
Jquery Ajax 学习实例2 向页面发出请求 返回JSon格式数据
2010/03/15 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
跟我学Node.js(四)---Node.js的模块载入方式与机制
2014/06/04 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
Vue.JS入门教程之处理表单
2016/12/01 Javascript
View.post() 不靠谱的地方你知道多少
2017/08/29 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
vue刷新和tab切换实例
2018/02/11 Javascript
详解关于Vue版本不匹配问题(Vue packages version mismatch)
2018/09/17 Javascript
跨域解决之JSONP和CORS的详细介绍
2018/11/21 Javascript
Node 模块原理与用法详解
2020/05/13 Javascript
[00:12]DAC2018 天才少年转战三号位,他的SOLO是否仍如昔日般强大?
2018/04/06 DOTA
Python字符串中查找子串小技巧
2015/04/10 Python
Python中的XML库4Suite Server的介绍
2015/04/14 Python
Python实现约瑟夫环问题的方法
2016/05/03 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
Python装饰器用法实例总结
2018/05/26 Python
Python爬虫使用脚本登录Github并查看信息
2018/07/16 Python
django Admin文档生成器使用详解
2019/07/22 Python
Python 复平面绘图实例
2019/11/21 Python
安装PyInstaller失败问题解决
2019/12/14 Python
python中把元组转换为namedtuple方法
2020/12/09 Python
浅谈h5自定义audio(问题及解决)
2016/08/19 HTML / CSS
简单叙述一下MYSQL的优化
2016/05/09 面试题
师范教师大学生职业生涯规划范文
2014/01/05 职场文书
党员个人对照检查材料范文
2014/09/24 职场文书
教师求职自荐信范文
2015/03/04 职场文书
2016年感恩母亲节活动总结
2016/04/01 职场文书
详解CSS玩转图片Base64编码
2021/05/25 HTML / CSS