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 相关文章推荐
一个oracle+PHP的查询的例子
Oct 09 PHP
用PHP和ACCESS写聊天室(四)
Oct 09 PHP
php入门之连接mysql数据库的一个类
Apr 21 PHP
无刷新动态加载数据 滚动条加载适合评论等页面
Oct 16 PHP
php中substr()函数参数说明及用法实例
Nov 15 PHP
php中通过DirectoryIterator删除整个目录的方法
Mar 13 PHP
PHP自定义函数实现格式化秒的方法
Sep 14 PHP
PHP快速排序quicksort实例详解
Sep 28 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
Nov 24 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
Oct 09 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
Oct 15 PHP
laravel框架学习笔记之组件化开发实现方法
Feb 01 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
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
PHP生成带有雪花背景的验证码
2008/09/28 PHP
一个漂亮的php验证码类(分享)
2013/08/06 PHP
PHP向浏览器输出内容的4个函数总结
2014/11/17 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
jquery插件制作简单示例说明
2012/02/03 Javascript
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
2014/06/24 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
JS设计模式之单例模式(一)
2017/09/29 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
举例讲解Python面向对象编程中类的继承
2016/06/17 Python
Python性能提升之延迟初始化
2016/12/04 Python
深入理解Python爬虫代理池服务
2018/02/28 Python
对python产生随机的二维数组实例详解
2018/12/13 Python
Python元组知识点总结
2019/02/18 Python
Python提取特定时间段内数据的方法实例
2019/04/01 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
Python装饰器结合递归原理解析
2020/07/02 Python
python 使用elasticsearch 实现翻页的三种方式
2020/07/31 Python
英国发展最快的在线超市之一:Click Marketplace
2021/02/15 全球购物
如何开发一个JQuery插件
2016/07/28 面试题
办公室文员岗位职责范本
2014/06/12 职场文书
民政局副局长民主生活会个人对照检查材料
2014/09/19 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
导游词之泉州崇武古城
2019/12/20 职场文书
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android
如何用vue实现网页截图你知道吗
2021/11/17 Vue.js