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 获取本机外网/公网IP的代码
May 09 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
Jan 29 PHP
php 批量生成html,txt文件的实现代码
Jun 26 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
Nov 01 PHP
以文件形式缓存php变量的方法
Jun 26 PHP
zen cart实现订单中增加paypal中预留电话的方法
Jul 12 PHP
Yii2中cookie用法示例分析
Jul 18 PHP
php计算多个集合的笛卡尔积实例详解
Feb 16 PHP
PHP手机号中间四位用星号*代替显示的实例
Jun 02 PHP
YII框架中使用memcache的方法详解
Aug 02 PHP
使用PHP反射机制来构造"CREATE TABLE"的sql语句
Mar 21 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
Oct 12 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
如何去掉文章里的 html 语法
2006/10/09 PHP
PHP 下载文件时自动添加bom头的方法实例
2014/01/10 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
2014/06/26 PHP
thinkPHP查询方式小结
2016/01/09 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
Aptana调试javascript图解教程
2009/11/30 Javascript
动态加载脚本提升javascript性能
2014/02/24 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
详解vue-cli脚手架build目录中的dev-server.js配置文件
2017/11/24 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
2018/06/20 jQuery
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
微信小程序之几种常见的弹框提示信息实现详解
2019/07/11 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
2020/10/13 Javascript
JS实现公告上线滚动效果
2021/01/10 Javascript
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
python分割文件的常用方法
2014/11/01 Python
Python functools模块学习总结
2015/05/09 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
2018/05/10 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
python实现贪吃蛇游戏
2020/03/21 Python
python实现最小二乘法线性拟合
2019/07/19 Python
详解使用django-mama-cas快速搭建CAS服务的实现
2019/10/30 Python
TensorFlow实现从txt文件读取数据
2020/02/05 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
html2canvas生成清晰的图片实现打印的示例代码
2019/09/30 HTML / CSS
作文评语集锦大全
2014/04/23 职场文书
幼儿园亲子活动总结
2014/04/26 职场文书
开展批评与自我批评发言材料
2014/05/15 职场文书
实习介绍信范文
2015/05/05 职场文书
2015年教学管理工作总结
2015/05/20 职场文书
《刷子李》教学反思
2016/02/20 职场文书
解决vue中provide inject的响应式监听
2022/04/19 Vue.js