位置: 编程技术 - 正文

php session的锁和并发(php中session什么意思)

编辑:rootadmin

推荐整理分享php session的锁和并发(php中session什么意思),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php中session和cookie,php中session和cookie,session.php,php session_start,php session_start,session.php,php中session的用法,php session_id,内容如对您有帮助,希望把文章链接给更多的朋友!

本文分享PHP的session在使用过程中的锁和并发的问题,与之相关的现象有请求阻塞、session数据丢失、session数据读不到。

我登录不了了某天,我准备登录我们一个后台系统,前去解决一个bug,在账户密码验证码都准确输入的情况下,我登录不上,经过多次实验发现主要有两个错误信息:

csrf验证失败 验证码错误【我对码神起誓我用半角输入了我看到的验证码,且顺序一致,无多加字符】

我们的系统我们的系统是基于phalcon 2.0.8 开发的,如你所见,我们在表单域加入了防止csrf攻击的域。也启用了验证码。

我首先对这两个组件进行查阅,发现他们都是将数据存于session:

然后我又查阅了我们session的实现,发现是将数据存储于redis的。

找啊找什么问题导致我登录不上呢?既然是数据验证上出现问题,就从数据着手吧,我登陆我们测试环境的redis机器,执行 redis-cli monitor,然后走一遍登录流程,发现输出如下(意思意思):

GET sessionId GET sessionId SETEX sessionId csrf=xxxx SETEX sessionId captcha=abcd

我们可以看到:

php session的锁和并发(php中session什么意思)

1、这里存在两次请求,一次是表单加载,一次是生成验证码的。2、存在“并发”的情况,这两个请求应该是表单加载渲染后才请求验证码的,也就是session顺序应该是get->set->get->set,看起来怎么是并发请求了。3、后面那个SETEX没有csrf的内容,也就是覆盖掉前面的数据了整个世界都不好了,不过也稍微明白是什么问题了。什么问题呢,说来话长,要从PHP的session数据的存取说起。

php的session数据的存取session的数据是经过编码成字符串存储在存储器【file、db、redis、memcache等】的,在我们使用session的时候,是什么时候去储存器取数据的?又是什么时候将数据写入存储器的?

这个问题的答案可能和一些朋友想的不一样,一个请求里面,PHP只会读取一次存储器,在session_start的时候,然后也只会写入一次存储器,在请求结束的时候,或调用session_write_close的时候,将数据刷回存储器,关闭session。

那么问题来了:

1、如果一个会话,同时出现两个读写session请求,没有保证获取1-写入1-获取2-写入2,同时没有cas版本管理机制的情况下,这些并发请求就会彼此读取不到对方的写入,最后写入的会把前面请求写入的session覆盖掉。2、如果请求是串行的,像登录页面的表单和验证码,也有可能前面的请求已经输出内容了,但是session还没写入,后面的请求就已经发起了。锁与不锁解决这种资源的并发一般会通过锁或版本管理来处理。但是版本管理我看不到好的方法。就聊聊锁吧。

其实锁是不大适合,有弊端的。

php的session,默认是用文件存储的,在打开session的时候,会对文件加独占锁,这样,其它请求就无法获取锁了,只能等待直到前面的锁解了。

这样保证了 读取-写入,读取-写入的顺序。

其它存储器,例如mysql,可以借助select for update进行行锁。redis可以通过一个自增键,返回1的获取到锁等来实现。

这个实现的话,对数据流来说很理想,但是,对于目前这种页面大量应用ajax的情况,所有请求排队处理,将大大加大页面展现的耗时,甚至出现请求超时等不可用故障。

没有解决的解决不建议过多使用session,其一次读取一次写入的机制所引发的问题,会造成坑的存在。在模版渲染前,或请求输出前调用session_write_close

标签: php中session什么意思

本文链接地址:https://www.jiuchutong.com/biancheng/289136.html 转载请保留说明!

上一篇:php5.4传引用时报错问题分析(php传值和传引用的区别)

下一篇:php使用timthumb生成缩略图的方法(php throw)

  • 增值税进项税额不得抵扣的几种情形
  • 报税申报不了
  • 会计科目长期待摊费用跟累计折旧分别是什么意思
  • 小规模销售免税农产品的分录
  • 累计纳税工资是什么意思
  • 去税务局申报需要带营业执照吗
  • 建筑企业异地预交税款如何处理
  • 增值税专用发票抵扣期限
  • 收到低值资产报废回收款账务处理
  • 筹建期间有收入怎么办
  • 差额发票和全额发票的税率
  • 电子承兑汇票接收和转出步骤
  • 按最低标准买社保30年退休后每个月领多少钱
  • 住宅租给公司办什么手续
  • 住宿费可以抵扣吗?
  • 营改增阶段
  • 酒店怎么缴纳增值税费用
  • 个人借款利息收入增值税税率
  • 预收房屋租金如何交房产税
  • 污水处理服务费用交印花税吗
  • 固定资产处理收入计入什么科目
  • 建筑业月末账务处理
  • 本年利润每个月都要结转吗
  • 预计负债 负债
  • 个人独资企业免费刻章吗
  • 已抵扣的增值税专票如何冲红
  • mac双系统切换键
  • 企业长期借款的利息,有可能计入的科目有( )
  • 发放应付职工薪酬的账务处理
  • 切换到多任务界面
  • 从上布法罗荒野地区的惠特克顶小道向东看,阿肯色州奥沙克国家森林 (© Jens Lambert Photography/Getty Images Plus)
  • PHP生成静态页面
  • 特种商品劳务税
  • vue程序运行过程
  • 增值税达不到起征点账务处理
  • vue3+antd
  • 国内版的chatpdf
  • 银行存放中央银行准备金的会计处理
  • c+c#
  • 交易性金融包括哪些
  • mysql命令大小写
  • sql存储过程详解图
  • 企业给员工报销的个人消费支出如何计税
  • 用库存现金支付职工医药费用69元,会计人员
  • 当月进项税大于销项税怎么办
  • 会员卡收费
  • 会计分录结转进项怎么算
  • 上级补助收入科目
  • 纳税人仅能通过手动查找
  • 增值税申报开具其他发票包含哪些
  • 小微企业的认定标准2023最新
  • 客户逾期不付款,需要赔多少违约金
  • 为什么留存收益不考虑筹资费用
  • 一家公司一定要有一个社保吗
  • 如何进行企业建账
  • 用union怎么把结果加起来
  • window10桌面有白色框
  • fedora最新版本
  • QQPCTray.exe是什么进程 QQPCTray.exe文件介绍
  • iPhone怎么录制屏幕
  • linux系统中
  • win7系统笔记本摄像头在哪里打开
  • windows1021h2更新
  • Linux基本命令使用
  • win7关机没有强制关机选项
  • win8系统打不开exe
  • CCAssert(sm_pSharedApplication, "")导致程序闪退的原因以及解决方案
  • jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
  • 如何进行js 的测试
  • bash 字符串操作
  • python多线程菜鸟教程
  • javascript绘制图形
  • jquery详解
  • python 获取uuid
  • 1.6t车船税
  • 江苏电子税务局网站官网
  • 国家税务局公告2018年第28号
  • 残疾人企业如何申请补贴
  • 纳税人的种类包括
  • 个人所得税怎么申报
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设