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 相关文章推荐
如何将一个表单同时提交到两个地方处理
Oct 09 PHP
php适配器模式介绍
Aug 14 PHP
Linux下CoreSeek及PHP扩展模块的安装
Sep 23 PHP
实用的简单PHP分页集合包括使用方法
Oct 21 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
Jun 19 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
Jul 25 PHP
php实现最简单的MVC框架实例教程
Sep 08 PHP
PHP生成静态HTML页面最简单方法示例
Apr 09 PHP
盘点PHP和ASP.NET的10大对比!
Dec 24 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
Feb 26 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
Apr 28 PHP
Laravel 添加多语言提示信息的方法
Sep 29 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制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
2015/09/26 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
jQuery插件uploadify实现ajax效果的图片上传
2016/06/18 Javascript
基于jQuery实现的幻灯图片切换
2016/12/02 Javascript
微信小程序 Tab页切换更新数据
2017/01/05 Javascript
JS常见算法详解
2017/02/28 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
2017/05/03 Javascript
JS 实现banner图片轮播效果(鼠标事件)
2017/08/04 Javascript
使用JS实现图片轮播的实例(前后首尾相接)
2017/09/21 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
js jquery 获取某一元素到浏览器顶端的距离实现方法
2018/09/05 jQuery
原生JS实现轮播图效果
2018/10/12 Javascript
Vue运用transition实现过渡动画
2019/05/06 Javascript
Vue对象赋值视图不更新问题及解决方法
2019/06/03 Javascript
OpenLayers3实现图层控件功能
2020/09/25 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
python 随机数生成的代码的详细分析
2011/05/15 Python
Python smallseg分词用法实例分析
2015/05/28 Python
Python文件读取的3种方法及路径转义
2015/06/21 Python
python检测是文件还是目录的方法
2015/07/03 Python
Python语言描述KNN算法与Kd树
2017/12/13 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
2018/04/23 Python
Python之dict(或对象)与json之间的互相转化实例
2018/06/05 Python
python判断数字是否是超级素数幂
2018/09/27 Python
python爬取基于m3u8协议的ts文件并合并
2019/04/26 Python
python实现宿舍管理系统
2019/11/22 Python
Python CSV文件模块的使用案例分析
2019/12/21 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
python如何编写类似nmap的扫描工具
2020/11/06 Python
仓库规划计划书
2014/04/28 职场文书
出纳岗位职责范本
2015/03/31 职场文书
2016教师廉洁从教心得体会
2016/01/13 职场文书