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 相关文章推荐
example1.php
Oct 09 PHP
php中一个有意思的日期逻辑处理
Mar 25 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
Mar 27 PHP
php的memcache类分享(memcache队列)
Mar 26 PHP
CentOS 6.3下安装PHP xcache扩展模块笔记
Sep 10 PHP
php读取csv数据保存到数组的方法
Jan 03 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
Apr 07 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
Jul 28 PHP
PHP 5.6.11中CURL模块问题的解决方法
Aug 08 PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 PHP
php微信开发之谷歌测距
Jun 14 PHP
laravel dingo API返回自定义错误信息的实例
Sep 29 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/10/09 PHP
linux下为php添加curl扩展的方法
2011/07/29 PHP
功能强大的PHP POST提交数据类
2016/07/15 PHP
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
2016/01/28 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
BootStrap Typeahead自动补全插件实例代码
2016/08/10 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
如何更好的编写js async函数
2018/05/13 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
react-navigation之动态修改title的内容
2018/09/26 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
python实现根据月份和日期得到星座的方法
2015/03/27 Python
python创建进程fork用法
2015/06/04 Python
python中利用xml.dom模块解析xml的方法教程
2017/05/24 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
对python读写文件去重、RE、set的使用详解
2018/12/11 Python
Python中捕获键盘的方式详解
2019/03/28 Python
用Python从0开始实现一个中文拼音输入法的思路详解
2019/07/20 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
Python新手如何理解循环加载模块
2020/05/29 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
小学生环保倡议书
2014/05/15 职场文书
2015大一新生军训感言
2015/08/01 职场文书
读《庄子》有感:美而不自知
2019/11/06 职场文书
Java实现房屋出租系统详解
2021/10/05 Java/Android
angular异步验证器防抖实例详解
2022/03/31 Javascript