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 相关文章推荐
删除无限级目录与文件代码共享
Jul 12 PHP
php Try Catch异常测试
Mar 01 PHP
php UTF8 文件的签名问题
Oct 30 PHP
php检测图片木马多进制编程实践
Apr 11 PHP
php-redis中的sort排序函数总结
Jul 08 PHP
在openSUSE42.1下编译安装PHP7 的方法
Dec 24 PHP
PHP微信API接口类
Aug 22 PHP
php实现当前页面点击下载文件的简单方法
Sep 22 PHP
php版微信自定义回复功能示例
Dec 05 PHP
laravel框架 api自定义全局异常处理方法
Oct 11 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
Feb 15 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的垃圾回收机制详解
2013/10/28 PHP
用php守护另一个php进程的例子
2015/02/13 PHP
Composer设置忽略版本匹配的方法
2016/04/27 PHP
php实时倒计时功能实现方法详解
2017/02/27 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
JavaScript之Getters和Setters 平台支持等详细介绍
2012/12/07 Javascript
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
jQuery实现带分组数据的Table表头排序实例分析
2015/11/24 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
BootstrapValidator实现注册校验和登录错误提示效果
2017/03/10 Javascript
微信小程序动态添加分享数据
2017/06/14 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
vue 返回上一页,页面样式错乱的解决
2019/11/14 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
python保存网页图片到本地的方法
2018/07/24 Python
DES加密解密算法之python实现版(图文并茂)
2018/12/06 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
详解Python高阶函数
2020/08/15 Python
支持IE8的纯css3开发的响应式设计动画菜单教程
2014/11/05 HTML / CSS
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
联想C++笔试题
2012/06/13 面试题
热能动力工程毕业生自荐信
2013/11/07 职场文书
最新党员思想汇报
2014/01/01 职场文书
初一生物教学反思
2014/01/18 职场文书
机关保密工作承诺书
2015/05/04 职场文书
2015年乡镇妇联工作总结
2015/05/19 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书
创业计划书之校园超市
2019/09/12 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
sass 常用备忘案例详解
2021/09/15 HTML / CSS