php请求阻塞的问题

今天发现公司出现一个问题
index是个耗时任务,请求的时候一直阻塞在那里
接下来第二个请求到来的时候也阻塞在那里
这是为什么呢?

先来分析下原因
刚开始我以为是fpm的问题,请求交给nginx后,通过fpm转交给worker进程处理的时候阻塞,应该是不会影响下一个请求的.因为两个请求由不同的worker进程处理.

那是什么原因呢?
查了下资料,发现每个请求进来都会启用session_start(),session吗,大家都知道.
那是怎么阻塞后续的请求呢?

原来seesion_start()的时候,会去服务器上找session文件.读取里面保存的session信息.
同学们注意了,session默认保存的是文件.意味着什么,读取的时候会有文件锁.

那么原因就很明显了
第一个请求进来,占有session文件,耗时处理.
第二个请求进来,发现session文件被占有,就阻塞等待.

结果也是跟我预计的一样.
当第一个请求返回的时候,后续请求立马执行了.

那可以怎么样规避这样的问题呢?

  1. 将session存到redis这样的内存缓存中;
  2. session读取完之后立马释放session_write_close();

注意的地方:
之前在本地测试时候,发现不管设置都是阻塞的,一度以为这个函数没什么用.后来思考了下,断定是我本地的phpstudy配置的问题.估计phpstudy就启动了一个进程来处理所有请求,所以导致了阻塞.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文github地址 1.PHP概述 1.1 PHP的历史发展 1995年由Lerdorf创建PHP,高级脚本语言...
    10xjzheng阅读 5,378评论 0 2
  • [toc] 在公司的网站上推荐使用 docker 容器来安装环境,一个项目一个 docker 容器。 、、 百度百...
    Mdvtrw阅读 5,360评论 0 1
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 6,298评论 0 9
  • 【日精进打卡第3天】 【知~学习】 《六项精进》2遍 共6遍 《大学》2遍 共24遍 【经典名句分享】 有志者,事...
    顾德成阅读 1,826评论 0 0