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

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

内容导读

收集整理的这篇技术教程文章主要介绍了php中fastcgi_finish_request的介绍及其实现非阻塞的代码,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2686字,纯文字阅读大概需要4分钟

内容图文

本篇文章给大家带来的内容是关于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);

运行测试


兼容非php-fpm

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


if (!function_exists("fastcgi_finish_request")) {




function fastcgi_finish_request()
{




}

}

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

保证进程单一运行

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

 $processId = realpath(__FILE__) . '-' . get_class($this);$filename = md5($processId);$file = '/tmp/'.$filename;if(!file_exists($filename)){

file_put_contents($file, getmypid());}else{

return true; }## do somthing 需要长时间处理的代码//处理完成后删除进程id记录文件unlink($file);

相关推荐:

php中神奇的fastcgi_finish_request

PHP利用fastcgi_finish_request()函数实现异步操作,提高响应速度

以上就是php中fastcgi_finish_request的介绍及其实现非阻塞的代码的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的php中fastcgi_finish_request的介绍及其实现非阻塞的代码全部内容,希望文章能够帮你解决php中fastcgi_finish_request的介绍及其实现非阻塞的代码所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。


本文关键词:

联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com