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 相关文章推荐
别人整理的服务器变量:$_SERVER
Oct 20 PHP
关于PHP5 Session生命周期介绍
Mar 02 PHP
色色整理的PHP面试题集锦
Mar 08 PHP
php分页思路以及在ZF中的使用
May 30 PHP
PHP图片上传代码
Nov 04 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
Jan 22 PHP
php的curl封装类用法实例
Nov 07 PHP
PHP解析目录路径的3个函数总结
Nov 18 PHP
PHP之将POST数据转化为字符串的实现代码
Nov 03 PHP
PHP实现的激活用户注册验证邮箱功能示例
Jun 06 PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 PHP
Laravel模型事件的实现原理详解
Mar 14 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
德生PL550的电路分析
2021/03/02 无线电
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
2013/07/01 PHP
php解决约瑟夫环示例
2014/04/09 PHP
php实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
如何在旧的PHP系统中使用PHP 5.3之后的库
2015/12/02 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
2016/05/04 PHP
php文件上传类的分享
2017/07/06 PHP
PHP数组访问常用方法解析
2020/09/05 PHP
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
JS实现黑色风格的网页TAB选项卡效果代码
2015/10/09 Javascript
使用CoffeeScrip优美方式编写javascript代码
2015/10/28 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
2019/06/18 jQuery
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
2019/11/04 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
2019/12/04 Javascript
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
利用Python的Django框架中的ORM建立查询API
2015/04/20 Python
SVM基本概念及Python实现代码
2017/12/27 Python
python 简单照相机调用系统摄像头实现方法 pygame
2018/08/03 Python
实例详解Matlab 与 Python 的区别
2019/04/26 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
使用keras实现Precise, Recall, F1-socre方式
2020/06/15 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
Python3压缩和解压缩实现代码
2021/03/01 Python
大学校园活动策划书
2014/02/04 职场文书
烹饪大赛策划方案
2014/05/26 职场文书
德育标兵事迹材料
2014/08/24 职场文书
个人查摆剖析材料
2014/10/16 职场文书
助学感谢信范文
2015/01/21 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
赢在执行观后感
2015/06/16 职场文书