php基于session锁防止阻塞请求的方法分析


Posted in PHP onAugust 07, 2017

本文实例讲述了php基于session锁防止阻塞请求的方法。分享给大家供大家参考,具体如下:

说明:

这是一篇参考国外网站http://konrness.com/php5/how-to-prevent-blocking-php-requests/ 的译文,前面一篇文章PHP编程中的Session阻塞问题与解决方法简单分析了php session阻塞的解决方法,这里给出另一种解决方法。

正文:

现代浏览器限制到一个host并发连接的数量一般为4或6。这意味着,如果您的web页面加载几十个来自同一个host的assert file(js、图像、css)时,由于并发数的限制,会产生排队。同样甚至更糟的是,这个问题也会发生在使用了session的php脚本中。

问题:

php的session缺省用文件存储,当请求一个需要操作session的php文件(session_start())时,这个文件是会被第一个操作session的进程锁定,导致其他请求阻塞。其他请求会挂起在session_start()直到session文件解锁。

解决:

由于锁定的session文件直到脚本执行结束或者session正常关闭才会解锁,为了防止大量的php请求(需要使用$_SESSION数据)被锁定,可以在写完session后马上关闭,这样就释放了锁。

关闭session:

session_write_close();

这个技巧非常管用,尤其对于一个处理时间长的脚本。并且这个函数只是关闭了写session,读还是可以的。

// 
session_start();
//可以读写session
$_SESSION['latestRequestTime'] = time();
//关闭session
session_write_close();
//读取session
$twitterId = $_SESSION['twitterId'];

译注:

在php5.4以后,session_set_save_handler 支持了传递SessionHandlerInterface 的方式,第二个参数就是指定session_write_close() 作为回调方法的(缺省就是true),将函数 session_write_close() 注册为 register_shutdown_function() 函数。

用Memcache或者Redis做session的存储,是能解决“锁定”的问题,但处理不好会导致连接数标高(在session操作后如果有耗时操作,连接是不回收的,可以主动在session写操作完成后做session_write_close() 操作)

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP中for循环语句的几种变型
Mar 16 PHP
MySQL修改密码方法总结
Mar 25 PHP
php 404错误页面实现代码
Jun 22 PHP
php 删除记录同时删除图片文件的实现代码
May 12 PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
May 24 PHP
PHP删除数组中特定元素的两种方法
Jul 02 PHP
php实现的短网址算法分享
Jun 20 PHP
mac环境中使用brew安装php5.5.15
Aug 18 PHP
PHP面向对象程序设计之接口用法
Aug 20 PHP
自定义session存储机制避免会话保持问题
Oct 08 PHP
php实现图片按比例截取的方法
Feb 06 PHP
详解将数据从Laravel传送到vue的四种方式
Oct 16 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
Aug 07 #PHP
PHP编程中的Session阻塞问题与解决方法分析
Aug 07 #PHP
PHP基于IMAP收取邮件的方法示例
Aug 07 #PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
Aug 07 #PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 #PHP
php封装的mongodb操作类代码
Aug 06 #PHP
php批量转换文件夹下所有文件编码的函数类
Aug 06 #PHP
You might like
Django中通过定时任务触发页面静态化的处理方式
2018/08/29 PHP
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
jQuery Tools tooltip使用说明
2012/07/14 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
jQuery EasyUI之DataGrid使用实例详解
2016/01/04 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
2016/09/21 Javascript
Nodejs 复制文件/文件夹的方法
2017/08/24 NodeJs
vue中配置mint-ui报css错误问题的解决方法
2017/10/11 Javascript
详解使用React全家桶搭建一个后台管理系统
2017/11/04 Javascript
Vue CLI3基础学习之pages构建多页应用
2019/06/02 Javascript
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
2020/01/26 Javascript
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
2021/01/13 Vue.js
[02:03]DOTA2亚洲邀请赛 HGT战队出场宣传片
2015/02/07 DOTA
[50:38]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第二场 3月7日
2021/03/11 DOTA
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
python自动化之Ansible的安装教程
2019/06/13 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
使用Django搭建一个基金模拟交易系统教程
2019/11/18 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
解决TensorFlow调用Keras库函数存在的问题
2020/07/06 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
CSS3控制HTML元素动画效果
2014/02/08 HTML / CSS
马德里著名的运动鞋商店:NOIRFONCE
2019/04/12 全球购物
物业公司采购员岗位职责
2013/12/31 职场文书
金融管理毕业生求职信
2014/03/03 职场文书
个人委托书格式
2014/04/04 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
禁烟标语大全
2014/06/11 职场文书
临床医学专业求职信
2014/08/08 职场文书
2015年保管员工作总结
2015/04/30 职场文书
2015年乡镇党务公开工作总结
2015/05/19 职场文书
故意伤害辩护词
2015/05/21 职场文书
毕业实习证明范本
2015/06/16 职场文书
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP
详解JavaScript的计时器和按钮效果设置
2022/02/18 Javascript