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数组函数序列之array_values() 获取数组元素值的函数与方法
Oct 30 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
Feb 19 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
Jun 26 PHP
php使用exec shell命令注入的方法讲解
Nov 12 PHP
如何实现php图片等比例缩放
Jul 28 PHP
php中二维数组排序问题方法详解
Aug 28 PHP
PHP使用curl模拟post上传及接收文件的方法
Mar 04 PHP
PHP 网站修改默认访问文件的nginx配置
May 27 PHP
PHP使用栈解决约瑟夫环问题算法示例
Aug 27 PHP
thinkPHP中钩子的使用方法实例分析
Nov 16 PHP
PHP实现的简单路由和类自动加载功能
Mar 13 PHP
PHP7.3.10编译安装教程
Oct 08 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
递归列出所有文件和目录
2006/10/09 PHP
PHP数组无限分级数据的层级化处理代码
2012/12/29 PHP
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
PHP中exec函数和shell_exec函数的区别
2014/08/20 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
php有效防止图片盗用、盗链的两种方法
2016/11/01 PHP
PHP实现对图片的反色处理功能【测试可用】
2018/02/01 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
2012/02/16 Javascript
window.open不被拦截的实现代码
2012/08/22 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
javascript点击按钮实现隐藏显示切换效果
2016/02/03 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
vue实现倒计时获取验证码效果
2020/04/17 Javascript
vue实现点击按钮下载文件功能
2019/10/11 Javascript
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
Python 类的魔法属性用法实例分析
2019/11/21 Python
python读取文件指定行内容实例讲解
2020/03/02 Python
Python jieba结巴分词原理及用法解析
2020/11/05 Python
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
自我评价格式
2014/01/06 职场文书
网络信息安全承诺书
2014/03/26 职场文书
租房协议书范本
2014/04/09 职场文书
2014年化验员工作总结
2014/11/18 职场文书
防汛通知
2015/04/25 职场文书
唐山大地震观后感
2015/06/05 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书
python tkinter模块的简单使用
2021/04/07 Python
Python学习开发之图形用户界面详解
2021/08/23 Python
Python各协议下socket黏包问题原理
2022/04/12 Python