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。

 

THE END