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 相关文章推荐
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
Oct 09 PHP
PHP的autoload自动加载机制使用说明
Dec 28 PHP
php 判断访客是否为搜索引擎蜘蛛的函数代码
Jul 29 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
Dec 10 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
Jun 17 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
Jun 20 PHP
php分割合并两个字符串的函数实例
Jun 19 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
Dec 31 PHP
php fseek函数读取大文件两种方法
Oct 12 PHP
PHP Mysqli 常用代码集合
Nov 12 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
Dec 29 PHP
PHP使用XMLWriter读写xml文件操作详解
Jul 31 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
PHP的面试题集,附我的答案和分析(一)
2006/11/19 PHP
PHP+MYSQL开发工具及资源收藏
2007/01/02 PHP
详解强大的jQuery选择器之基本选择器、层次选择器
2012/02/07 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
jQuery层动画定位滑动效果的方法
2015/04/30 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
javascript正则表达式之分组概念与用法实例
2016/06/16 Javascript
jquery对Json的各种遍历方法总结(必看篇)
2016/09/29 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
vue中在vuex的actions中请求数据实例
2019/11/08 Javascript
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
Python中bisect的用法
2014/09/23 Python
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
解决python2.7用pip安装包时出现错误的问题
2017/01/23 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
使用python将图片按标签分入不同文件夹的方法
2018/12/08 Python
django实现用户注册实例讲解
2019/10/30 Python
Django 后台带有字典的列表数据与页面js交互实例
2020/04/03 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
HTML5计时器小例子
2013/10/15 HTML / CSS
美国领先的在线旅游网站:Orbitz
2018/11/05 全球购物
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
Carrs Silver官网:英国著名的银器品牌
2020/08/29 全球购物
回门宴父母答谢词
2014/01/26 职场文书
本科毕业生专业自荐书范文
2014/02/05 职场文书
设备售后服务承诺书
2014/05/30 职场文书
音乐教师求职信
2014/06/28 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
无犯罪记录证明范本
2014/09/15 职场文书
Java基于字符界面的简易收银台
2021/06/26 Java/Android
Golang数据类型和相互转换
2022/04/12 Golang
Oracle中DBLink的详细介绍
2022/04/29 Oracle