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 相关文章推荐
开源SNS系统-ThinkSNS
May 18 PHP
php下检测字符串是否是utf8编码的代码
Jun 28 PHP
PHP 处理图片的类实现代码
Oct 23 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
Sep 10 PHP
PHP中PDO的错误处理
Sep 04 PHP
两级联动select刷新后其值保持不变的实现方法
Jan 27 PHP
php中try catch捕获异常实例详解
Nov 21 PHP
php+ajax实现无刷新的新闻留言系统
Dec 21 PHP
PHP递归创建多级目录
Nov 05 PHP
thinkPHP数据库增删改查操作方法实例详解
Dec 06 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
Dec 15 PHP
php session的应用详细介绍
Mar 22 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/02/03 PHP
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
php实现微信发红包
2015/12/05 PHP
laravel学习教程之存取器
2016/07/30 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
js正确获取元素样式详解
2009/08/07 Javascript
原生js封装二级城市下拉列表的实现代码
2016/06/16 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
原生JavaScript实现日历功能代码实例(无引用Jq)
2019/09/23 Javascript
vue之组件内监控$store中定义变量的变化详解
2019/11/08 Javascript
用js编写留言板
2020/03/17 Javascript
微信小程序实现打卡签到页面
2020/09/21 Javascript
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
Python入门篇之条件、循环
2014/10/17 Python
Python中标准库OS的常用方法总结大全
2017/07/19 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
2018/10/15 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
python单例模式的多种实现方法
2019/07/26 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
python Canny边缘检测算法的实现
2020/04/24 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
HTML5网页录音和上传到服务器支持PC、Android,支持IOS微信功能
2019/04/26 HTML / CSS
Nike爱尔兰官方网站:Nike.com (IE)
2018/03/12 全球购物
新加坡交友网站:be2新加坡
2019/04/10 全球购物
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
小学德育工作总结2015
2015/05/12 职场文书
iPhone13再次曝光
2021/04/15 数码科技
Python异常类型以及处理方法汇总
2021/06/05 Python
VUE中的v-if与v-show区别介绍
2022/03/13 Vue.js