PHP使用fastcgi_finish_request函数遇到session锁阻塞问题

前言

在实际项目中经常会有这样的需求,对于前端发过来的请求,需要在后端进行长时间的处理,但为了让使用者有更好的体验,为了让PHP在后端处理长时间任务时不阻塞,快速响应页面请求,因此在这里对fastcgi_finish_request的应用进行总结归纳。当然php实现非阻塞的方式有很多种,比如异步脚本、swoole,但个人认为fastcgi_finish_request(当PHP运行在FPM/FastCGI模式提供的函数)最为简单方便。

问题

1.使用了session_start 之后

2.当使用fastcgi_finish_request 执行后

3.再去请求其他接口动作时 还是就会被阻塞在那里

4.直到前面页面执行完毕后面的才会进行

5.这里是因为session锁导致的阻塞

解决

fastcgi_finish_request 函数前面加上session_write_close 函数关闭session文件

session_start();
....
session_write_close();
fastcgi_finish_request();

解答

因为php默认是用文件来保存session的,而且这个session文件是阻塞锁的,要等php执行完才解锁,所以,下个请求只能要等待前面的处理完。可以在需要长时间运行的操作前,关闭session文件,下一个请求就不会阻塞了。即,加上这个代码:session_write_close() 

fastcgi_finish_reques函数的缺点

1.PHP FastCGI 进程数有限,正在处理异步操作的php-cgi进程,无法处理新请求;

2.如果并发访问量较大,php-cgi进程数用满,新访问请求,将没有php-cgi去处理。Nginx服务器会出现: 502 Bad Gateway。

 

版权声明:
作者:Teroun
链接:https://blog.bingxs.com/phpsyfastcgifinishrequesthsydsessionszrwt.html
来源:冰心博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
PHP使用fastcgi_finish_request函数遇到session锁阻塞问题
前言 在实际项目中经常会有这样的需求,对于前端发过来的请求,需要在后端进行长时间的处理,但为了让使用者有更好的体验,为了让PHP在后端处理长时间任务时不……
<<上一篇
下一篇>>