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 相关文章推荐
第十四节--命名空间
Nov 16 PHP
默默小谈PHP&MYSQL分页原理及实现
Jan 02 PHP
PHP无限分类的类
Jan 02 PHP
站长助手-网站web在线管理程序 v1.0 下载
May 12 PHP
php相当简单的分页类
Oct 02 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
Jun 13 PHP
PHP PDO fetch 模式各种参数的输出结果一览
Jan 07 PHP
php基于自定义函数记录log日志方法
Jul 21 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
Thinkphp自定义生成缩略图尺寸的方法
Aug 05 PHP
laravel框架添加数据,显示数据,返回成功值的方法
Oct 11 PHP
laravel 自定义常量的两种方案
Oct 14 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 神盾解密
2014/06/08 PHP
PHP中单引号与双引号的区别分析
2014/08/19 PHP
大家都应该掌握的PHP关联数组使用技巧
2015/12/25 PHP
thinkPHP基于ajax实现的菜单与分页示例
2016/07/12 PHP
浅谈laravel orm 中的一对多关系 hasMany
2019/10/21 PHP
动态加载iframe
2006/06/16 Javascript
javascript 写类方式之五
2009/07/05 Javascript
javascript中使用css需要注意的地方小结
2010/09/01 Javascript
Jquery 插件开发笔记整理
2011/01/17 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
Linux下编译安装MySQL-Python教程
2015/02/02 Python
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
Python使用微信接入图灵机器人过程解析
2019/11/04 Python
Python学习之路安装pycharm的教程详解
2020/06/17 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
css 省略号 css3让多余的字符串消失并附加省略号的实现代码
2013/02/07 HTML / CSS
用HTML5.0制作网页的教程
2010/05/30 HTML / CSS
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
巴西Bo.Bô官方在线商店:经营奢侈品时尚业务
2020/03/16 全球购物
叙述DBMS对数据控制功能有哪些
2016/06/12 面试题
机械设计毕业生自荐信
2014/02/02 职场文书
群众路线党员个人剖析材料
2014/10/08 职场文书
2014年营销工作总结
2014/11/22 职场文书
商业门面租房协议书
2014/11/25 职场文书
中学生思想品德评语
2014/12/31 职场文书
MySQL子查询中order by不生效问题的解决方法
2021/08/02 MySQL
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android