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 相关文章推荐
PHP 读取大文件的X行到Y行内容的实现代码
Jun 24 PHP
CodeIgniter基本配置详细介绍
Nov 12 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
Apr 09 PHP
php表单请求获得数据求和示例
May 15 PHP
浅谈php扩展imagick
Jun 02 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
May 09 PHP
PHP+JS实现的商品秒杀倒计时用法示例
Nov 15 PHP
php实现的中文分词类完整实例
Feb 06 PHP
php正确输出json数据的实例讲解
Aug 21 PHP
php7 图形用户界面GUI 开发示例
Feb 22 PHP
php实现根据身份证获取精准年龄
Feb 26 PHP
PHP网页缓存技术优点及代码实例
Jul 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 flush类输出缓冲剖析
2008/10/19 PHP
php正则表达匹配中文问题分析小结
2012/03/25 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
input的focus方法使用
2010/03/13 Javascript
jQuery源码分析之Event事件分析
2010/06/07 Javascript
jQuery实现可收缩展开的级联菜单实例代码
2013/11/27 Javascript
Javascript 实现图片无缝滚动
2014/12/19 Javascript
javascript实现字符串反转的方法
2015/02/05 Javascript
网页从弹窗页面单选框传值至父页面代码分享
2015/09/29 Javascript
javascript每日必学之多态
2016/02/23 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
2018/02/27 Javascript
webpack4.0打包优化策略整理小结
2018/03/30 Javascript
webpack里使用jquery.mCustomScrollbar插件的方法
2018/05/30 jQuery
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
js实现简单点赞操作
2020/03/17 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
python在windows命令行下输出彩色文字的方法
2015/03/19 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
tensorflow输出权重值和偏差的方法
2018/02/10 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
Django 查询数据库并返回页面的例子
2019/08/12 Python
python递归下载文件夹下所有文件
2019/08/31 Python
解析Python3中的Import
2019/10/13 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
2020/05/19 Python
Python爬虫之App爬虫视频下载的实现
2020/12/08 Python
班组长的岗位职责
2013/12/09 职场文书
企业承诺书格式范文
2015/04/28 职场文书
汉字听写大会观后感
2015/06/12 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers
Mysql中mvcc各场景理解应用
2022/08/05 MySQL