PHP – fastcgi_finish_request(服务器扩展函数)
前言
在实际项目中经常会有这样的需求,对于前端发过来的请求,需要在后端进行长时间的处理,但为了让使用者有更好的体验,为了让PHP在后端处理长时间任务时不阻塞,快速响应页面请求,因此在这里对fastcgi_finish_request的应用进行总结归纳。当然php实现非阻塞的方式有很多种,比如异步脚本、swoole,但个人认为fastcgi_finish_request最为简单方便。
介绍
fastcgi_finish_request — 冲刷(flush)所有响应的数据给客户端
此函数冲刷(flush)所有响应的数据给客户端并结束请求。 这使得客户端结束连接后,需要大量时间运行的任务能够继续运行。
当PHP运行在PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)模式提供的函数(PHP-FPM是Linux系统特有的,Win系统不支持)
session锁阻塞问题
问题
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-FPM 进程数有限,正在处理异步操作的php-cgi进程,无法处理新请求;
2.如果并发访问量较大,php-cgi进程数用满,新访问请求,将没有php-cgi去处理。Nginx服务器会出现: 502 Bad Gateway。