首页 > 编程 > PHP > 正文

php中fastcgi_finish_request的介绍及其实现非阻塞的代码

2020-03-22 18:28:03
字体:
来源:转载
供稿:网友
本篇文章给大家带来的内容是关于php中fastcgi_finish_request的介绍及其实现非阻塞的代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

前言

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

基本应用fastcgi_finish_request介绍

(PHP 5 = 5.3.3, PHP 7)

fastcgi_finish_request — 冲刷(flush)所有响应的数据给客户端

boolean fastcgi_finish_request ( void )

函数冲刷(flush)所有响应的数据给客户端并结束请求。 这使得客户端结束连接后,需要大量时间运行的任务能够继续运行。

返回值

成功时返回 TRUE, 或者在失败时返回 FALSE

注意问题

PHP 与 Web 服务器使用了PHP-FPM(FastCGI进程管理器),那通过fastcgi_finish_request() 函数能马上结束会话,而 PHP 线程可以继续在后台运行。也就是说只针对php-fpm的进程管理方式才能使用该函数

只要代码运行到这个位置,就已经断开请求返回参数给客户端了。接下来的代码都和客户端没有关系了。也就是说对于输出在页面的内容必须放在fastcgi_finish_request函数之前

fastcgi_finish_request()结束客户端连接之后,运行时间依然会受max_execution_time超时时间的影响,也就是说如果预计到代码在后端执行时间比较久,还是要设定set_time_limit(0)

在高并发下执行时间过久也会导致fastcgi进程不够用,不能及时释放,就会爆502错误了。

应用
echo program start... file_put_contents( /tmp/garylog.log , start-time: .date( Y-m-d H:i:s ). /n , FILE_APPEND);fastcgi_finish_request();sleep(1);// set_time_limit(0);// sleep(150);$num = 25;$num += 1;sleep(5);echo debug... file_put_contents( /tmp/garylog.log , start-proceed: .$num. ,时间 .date( Y-m-d H:i:s ). /n , FILE_APPEND);sleep(10);file_put_contents( /tmp/garylog.log , end-time: .date( Y-m-d H:i:s ). /n , FILE_APPEND);

运行测试

381344182-5b7e62f4232d3_articlex.png

997751714-5b7e6310816d1_articlex.png

兼容非php-fpm

从代码的可移植性讲的话, 可以在代码中附上如下代码:

 if (!function_exists( fastcgi_finish_request )) { function fastcgi_finish_request() { }

不会造成代码部署在非fpm环境下造成问题.

保证进程单一运行

对于上面说到的问题:在高并发下执行时间过久也会导致fastcgi进程不够用,不能及时释放。同时我们的需求仅仅是为了起到触发的作用,并不需要每次运行,那么可以考虑使用下面的方法,避免重复占用进程。

 $processId = realpath(__FILE__) . - . get_html' target='_blank'>class($this);$filename = md5($processId);$file = /tmp/ .$filename;if(!file_exists($filename)){ file_put_contents($file, getmypid());}else{ return true; 
独孤九贱(5)_ThinkPHP5视频教程

ThinkPHP是国内最流行的中文PHP开发框架,也是您Web项目的最佳选择。《VeVb.com独孤九贱(5)-ThinkPHP5视频教程》课程以ThinkPHP5最新版本为例,从最基本的框架常识开始,将...

Peter-Zhu 2017-05-16 12:03:57


独孤九贱(4)_PHP视频教程

江湖传言:PHP是世界上最好的编程语言。真的是这样吗?这个梗究竟是从哪来的?学会本课程,你就会明白了。PHP 出品的PHP入门系统教学视频,完全从初学者的角度出发,绝不玩虚的,一切以实用、有用...

Peter-Zhu 2017-03-20 22:47:17


独孤九贱(1)_HTML5视频教程

《VeVb.com原创html5视频教程》课程特色:php 原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了HTML知识。...

Peter-Zhu 2017-03-13 10:15:11


ThinkPHP5实战之[教学管理系统]

本套教程,以一个真实的学校教学管理系统为案例,手把手教会您如何在一张白纸上,从零开始,一步一步的用ThinkPHP5框架快速开发出一个商业项目。

Peter-Zhu 2017-07-24 16:48:56


PHP入门视频教程之一周学会PHP

所有计算机语言的学习都要从基础开始,《PHP入门视频教程之一周学会PHP》不仅是PHP的基础部分更主要的是PHP语言的核心技术,是学习PHP必须掌握的内容,任何PHP项目的实现都离不开这部分的内容,通...

PHP教程

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表