
|
导读网页的本质就是超级文本标记语言,通过结合使用其他的Web技术(如:脚本语言、公共网关接口、组件等),可以创造出功能强大的网页。因而,超级文本标记语言是万维网(Web)编程的基础,也就是说万维网是建立... 网页的本质就是超级文本标记语言,通过结合使用其他的Web技术(如:脚本语言、公共网关接口、组件等),可以创造出功能强大的网页。因而,超级文本标记语言是万维网(Web)编程的基础,也就是说万维网是建立在超文本基础之上的。超级文本标记语言之所以称为超文本标记语言,是因为文本中包含了所谓“超级链接”点。 本篇文章给大家带来的内容是关于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 注意问题
应用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中文网其它相关文章! 网站建设是一个广义的术语,涵盖了许多不同的技能和学科中所使用的生产和维护的网站。 |
温馨提示:喜欢本站的话,请收藏一下本站!