在做一个DSP系统(不要纠结这个系统是做什么的)时,碰到了一个很奇特的bug。

事情背景:

1.媒体方要求素材必须通过API提交给他们审核后,方可投放使用。

2.上线不久,运营反馈“每当提交素材的时候,后台就会卡住...”(后台提交素材,会同步提交API)

3.访问量:不超100IP(后台仅内部人员访问)

原因调查:

环境:WAMP

  系统:Windows server 2012(也不要问我为啥不是linux...)  

  web:apache2.4.23

数据库:mysql5.7.14

   语言:PHP 5.6.25

框架:ThinkPHP

  起初认为是mysql占住了进程(瞎猜),后来一想走API也不会涉及到数据库呀?

  后来实测发现:只有操作人会卡住(再想访问就会等待之前的API请求完成),其他人不会卡住。

   在A用户提交素材走API后,在访问的第二个页面会卡住

   而B用户在此时不会卡住

  而A的第二次链接和B的链接的区别就在于,A的session和走API时的session是同一个!!

   而A之所以卡住,绝对是session锁住了!

  PHP默认 session是以文件方式存放的,而且如果不声明不需要写session,php会在本次连接结束前一直写锁住session文件.

  B用户不会卡住,就是因为它没有用到走API时被锁住的session文件。

  解决办法:session_write_close()

  在不需要写session时,要调用上述方法,让php解锁session文件(本bug仅限以文件方式存放session的情况)

  

记一次因为session引起的并发问题的更多相关文章

  1. PHP Session可能会引起并发问题

    在进行Web应用程序开发的时候,人们经常会用Session存储数据.但可能有人不知道,在PHP中,Session使用不当可能会引起并发问题.印度医疗行业软件解决方案提供商Plus91 Technolo ...

  2. session文件无法并发操作

    session_start():打开服务器上的session文件. session_commit():会把$_SESSION数组的内容写入到服务器上的session文件中,但不会清空$_SESSION ...

  3. php session在高并发时可能存在的问题。

    如果同一个客户端并发发送多个请求,而每个请求都使用了Session,那么PHP Session锁的存在会导致服务器串行响应这些请求,而不是并行.这是因为在默认情况下,PHP使用文件存储Session数 ...

  4. 【原创】记一次MySQL大表高并发写入引发CPU飙升的排障过程

    目录 一.故障现象... 1 二.初步分析... 2 三.排障过程... 2 1.排查是否QPS或insert并发请求上升导致问题发生... 2 2.排查是否锁资源等待或block导致了insert变 ...

  5. memcached迁移方案——记一次memcached session服务的迁移

    背景: (1)由于机房调整,需要迁移memcached: (2)需要在短期内迁移完成(一周以内): (3)该memcached 保存了用户的登录数据,非常重要,一旦出问题将导致大量的用户被踢出: (4 ...

  6. Flink使用(三)——记一次Flink Session任务反复重启

    前言 环境: JDK 1.8+Flink 1.6+Hadoop 2.7.3 文中若有表述不正确,欢迎大伙留言指出,谢谢! 1.现象 使用yarn-session在yarn上启动flink集群并提交任务 ...

  7. 如何实现 集群化/Session 复制-doc(cluster-howto.html)

    源文档链接: http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html 翻译日期: 2014年3月19日 翻译人员: 铁锚 感受: Tomc ...

  8. session和cookie的简单理解

    0. 引子,我们为什么要cookie和session       因为http请求是无状态的(不能记录用户的登录状态等),所以需要某种机制来保存用户的登录状态等信息,在下次访问web服务的时候,不用再 ...

  9. Cookie与Session的区别-总结很好的文章

    Cookie与Session的区别-总结很好的文章 本文分别对Cookie与Session做一个介绍和总结,并分别对两个知识点进行对比分析,让大家对Cookie和Session有一个更深入的了解,并对 ...

随机推荐

  1. Python算法和数据结构:在二叉树中找到和为sum的所有路径

    玄魂工作室秘书 [玄魂工作室] 思路:先用递归创建一颗二叉树,作为输入:然后对这课二查树进行递归遍历,递归中每遍历一个节点,下次递归的和为sum-data;并用一个数组记录遍历过的路径,当存在sum时 ...

  2. Linux命令及架构部署大全

    1.Linux系统基础知识 Linux 基础优化配置 Linux系统根目录结构介绍 linux系统重要子目录介绍 Linux基础命令(之一)详解 Linux基础命令(之二)详解 Linux文件系统 L ...

  3. ubuntu修改键盘映射

    code {margin: 0;padding: 0;font-size: 100%;word-break: normal;background: transparent;border: 0;}ol ...

  4. Redis 小记

    最近感觉自己像是又回到了起点,知识层面上落人太多,尤其是去年早些时候几乎啥也没干成,觉得什么也不会了,只能再次从零开始,所以决定再喝两个疗程的巩固巩固. 话不多说,我们先来看看 Redis 官方是怎么 ...

  5. LeetCode算法题-Robot Return to Origin(Java实现)

    这是悦乐书的第281次更新,第298篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第149题(顺位题号是657).在2D平面上有一个从位置(0,0)开始的机器人.给定其移 ...

  6. hadoop rpc协议客户端与服务端的交互流程

    尽管这里是hadoop的rpc服务,但是hadoop还是做到了一次连接仅有一次认证.具体的流程待我慢慢道来. 客户端:这里我们假设ConnectionId对应的Connection并不存在.在调用ge ...

  7. service相关

    本篇仍以问题为驱动 一.什么时Service? Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,只不过它没有UI界面,是在后台运行的组件.Ser ...

  8. leetcode math类型题目解题总结

    2. Add Two Numbers https://leetcode.com/problems/add-two-numbers/description/ class Solution { publi ...

  9. .Net Core 实践 - 如何在控制台应用(.Net Core)使用appsettings.json配置

    新建控制台应用(.Net Core)程序 添加json文件,命名为appsettings.json,设置文件属性 如果较新则复制.添加内容如下 { "MyWords" : &quo ...

  10. 学习经验分享(最近听了一节Java公开课)

    最近听了一节Java公开课,讲的Tomcat8.0的,老师分享的学习方法很好, 时间和精力要用对地方 1.学习一个知识的广度和深度,先学主要的主流的,不要学了很多不该学,没必要学的东西 2.要花时间总 ...