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
phpMyAdmin 安装教程全攻略
Mar 19 PHP
PHP nl2br函数 将换行字符转成 <br>
Aug 21 PHP
由php的call_user_func传reference引发的思考
Jul 23 PHP
PHP获取中英混合字符串长度的方法
Jun 07 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
Jul 04 PHP
php计算给定时间之前的函数用法实例
Apr 03 PHP
thinkphp实现图片上传功能
Jan 13 PHP
使用symfony命令创建项目的方法
Mar 17 PHP
关于PHP内置的字符串处理函数详解
Feb 04 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
Jun 09 PHP
Yii框架ACF(accessController)简单权限控制操作示例
Apr 26 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部分常见问题总结
2008/03/27 PHP
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
php三元运算符知识汇总
2015/07/02 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
JS日历 推荐
2006/12/03 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
javascript实现显示和隐藏div方法汇总
2015/08/14 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
2016/05/12 Javascript
jquery版轮播图效果和extend扩展
2017/07/18 jQuery
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
Javascript 编码约定(编码规范)
2018/03/11 Javascript
详解vue-cli下ESlint 配置说明
2018/09/03 Javascript
vue element ui validate 主动触发错误提示操作
2020/09/21 Javascript
javascript中导出与导入实现模块化管理教程
2020/12/03 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
JavaScript实现点击自制菜单效果
2021/02/02 Javascript
[04:50]DOTA2亚洲邀请赛小组赛第四日 TOP10精彩集锦
2015/02/02 DOTA
Linux下使用python调用top命令获得CPU利用率
2015/03/10 Python
Python 常用 PEP8 编码规范详解
2017/01/22 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
Python中存取文件的4种不同操作
2018/07/02 Python
django多个APP的urls设置方法(views重复问题解决)
2019/07/19 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
2021/02/05 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
巴西购物网站:Onofre Agora
2020/06/08 全球购物
公务员培训自我鉴定
2013/09/19 职场文书
数控专业应届生求职信
2013/11/27 职场文书
我的老师教学反思
2014/05/01 职场文书
房地产推广策划方案
2014/05/19 职场文书
物流管理系毕业生求职信
2014/06/03 职场文书
社保转移委托书范本
2014/10/08 职场文书
幼儿园安全教育随笔
2015/08/14 职场文书