当PHP运行在FastCGI模式时,PHP FPM提供了一个名为fastcgi_finish_request的方法。按照文档上的说法,此方法可以提高请求的处理速度,如果有些处理可以在页面生成完后再进行,就可以使用这个方法。
听起来可能有些茫然,我们通过几个例子来说明一下:
<?php
echo '例子:';
fastcgi_finish_request();
echo 'To be, or not to be, that is the question.';
file_put_contents('log.txt', '生存还是毁灭,这是个问题。');
?>
通过浏览器(不是命令行!)运行此脚本,结果发现并没有输出相应的字符串,但却生成了相应的文件。由此说明在调用fastcgi_finish_request后,客户端响应就已经结束,但与此同时服务端脚本却继续运行!
合理利用这个特性可以大大提升用户体验,趁热打铁再来一个例子:
<?php
echo '例子:';
file_put_contents('log.txt', date('Y-m-d H:i:s') . " 上传视频\n", FILE_APPEND);
fastcgi_finish_request();
sleep(1);
file_put_contents('log.txt', date('Y-m-d H:i:s') . " 转换格式\n", FILE_APPEND);
sleep(1);
file_put_contents('log.txt', date('Y-m-d H:i:s') . " 提取图片\n", FILE_APPEND);
?>
代码里用sleep模拟一些耗时的操作,浏览时没有被堵塞,程序却都执行了,具体看日志。
末了给您提个醒,Yahoo在Best Practices for Speeding Up Your Web Site中提到了Flush the Buffer Early,也就是利用PHP中的flush方法把内容尽快发到客户端去,虽然表面上它和本文介绍的fastcgi_finish_request有些许的类似,但本质上完全不同,别混淆了。
---------------------------
echo jsonTrue();//客户端返回成功结果,后台进程继续执行
fastcgi_finish_request();
....
end();
分享到:
相关推荐
在描述的示例中,我们可以看到,当`fastcgi_finish_request`被调用后,浏览器接收到的第一个字符串"例子:"是立即显示的,然而后续的"To be, or not to be, that is the question."并没有被浏览器接收到,因为`...
fastcgi_finish_request(); // 后台耗时操作 sleep(5); echo '后台任务完成。'; // 这部分客户端是看不到的 ?> ``` 上述代码中,"开始处理..."会被立即发送给浏览器,而"后台任务完成。"则会在后台处理完成后输出,...
在执行任务之前使用fastcgi_finish_request()来完成请求的示例<?php Procrastinator for PHP:稍后做的事情一些类可帮助您稍后执行复杂的任务(例如发送邮件)。 在执行任务之前使用fastcgi_finish_request...
14. 通过PHP-FPM,可以设置REQUEST_BODY_FILE等fastcgi_param,来处理通过POST方法接收的请求体数据。 15. PHP-FPM对PHP 4和PHP 5的支持是有差异的,其中PHP 5增强了对graceful restarts的支持。 16. PHP-FPM可以...
在示例代码中,"program start."会被立即发送到浏览器,而"debug..."由于在`fastcgi_finish_request()`之后,浏览器无法接收到。 2. **非阻塞的网络I/O操作**: 使用`fsockopen`或`cUrl`的非阻塞模式可以发起异步...
要求需要支持fastcgi_finish_request ,否则瞬态将立即重新生成过期数据。安装该库旨在包含在作曲家中。 要安装,请运行composer require 10up/async-transients 。 该库设置为使用 composer 的自动加载器,因此请...
APC的进度条功能在PHP 5.x版本中可用,但在PHP 7.x中已经被弃用,建议转向使用`sysvmsg`、`session`或者其他更现代的解决方案,如`php-fpm`的`fastcgi_finish_request`和`nginx`的`proxy_pass_request_body Off`配合...
Fixed bug #73807 (Performance problem with processing post request over 2000000 chars). Fixed bug #74111 (Heap buffer overread (READ: 1) finish_nested_data from unserialize). Fixed bug #74603 ...
request.finish(); } }); server.start(); } } ``` 在这个例子中,`handleRequest`方法接收FastCGI请求,并生成相应的响应。`FCGIServer`监听8000端口,当收到FastCGI请求时,会调用注册的处理器。 总结,...
这通常涉及到`task_worker_num`、`task_max_request`等相关配置和`$server->task`、`$server->finish`方法的使用。 4. 长连接:Swoole支持与客户端建立长连接,可以实现高效的数据推送和服务端主动向客户端发送消息...