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就启动了一个进程来处理所有请求,所以导致了阻塞.

你可能感兴趣的:(php请求阻塞的问题)