PHP fastcgi_finish_request 方法
本文介绍,PHP运行在FastCGI模式时,FPM提供的方法:fastcgi_finish_request。
在说这个方法之前,我们先了解PHP有哪些常用的运行模式?
PHP运行模式
CGI 通用网关接口 / Common Gateway Interface
CGI已经是比较老的模式了,这几年都很少用了。
介绍:每有一个用户请求,都会先要创建CGI的子进程,然后处理请求,处理完后结束这个子进程,这就是Fork-And-Execute模式。
当用户请求数量非常多时,会大量挤占系统的资源如内存,CPU时间等。
缺点:在高访问需求的情况下,CGI的进程Fork就会成为很大的服务器负担。
FastCGI(常驻型CGI / Long-Live CGI)
使用的比较多。
介绍:FastCGI是CGI的升级版本,FastCGI像是一个常驻 (long-live)型的 CGI。
它可以一直执行着,只要激活后,不会每次都要花费时间去 Fork 一次。
FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。
Apache、Nginx、lighttpd 等流行的 HTTP server 都支持FastCGI。
原理:
1.Web Server启动时载入FastCGI进程管理器(PHP-FPM);
2.FastCGI进程管理器初始化启动多个CGI解释器进程并等待来自Web Server的连接;
3.当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器;
4.Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi;
5.FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。
当FastCGI子进程关闭连接时,请求便告处理完成。
FastCGI子进程接着等待并处理来自FastCGI进程管理器的下一个连接。
CLI模式
介绍:PHP-CLI是PHP Command Line Interface的简称,就是PHP在命令行中运行。
Windows、Linux下都支持PHP-CLI模式。
模块模式
介绍:模块模式是以mod_php5模块的形式集成的。
mod_php5模块的作用是接收Apache传递过来的PHP文件请求,并处理这些请求,然后将处理后的结果返回给Apache。
Apache的配置文件httpd.conf中添加一行:
LoadModule php5_module modules/mod_php5.so
以上只是简单的让大家了解下,如果有兴趣可以查阅相关文章。
接下来,我们来介绍:fastcgi_finish_request。
fastcgi_finish_request
PHP运行在FastCGI模式时,FPM提供的方法:fastcgi_finish_request。
官方地址:http://php.net/manual/zh/function.fastcgi-finish-request.php
官方解释:冲刷(flush)所有响应的数据给客户端。
个人理解:在调用方法的时候,会发送响应,关闭连接,但是不会结束PHP的运行。
不理解的可以直接运行如下代码:
//代码:
echo date('Y-m-d H:i:s', time())."\r\n"; //会输出 fastcgi_finish_request(); set_time_limit(0); //避免超时报错 ini_set('memory_limit', '-1'); //避免内存不足 sleep(5); $time = date('Y-m-d H:i:s', time())."\r\n"; echo $time; //不会输出 file_put_contents('test.txt', $time, FILE_APPEND);
执行这段函数后你会发现,可以实现异步操作,提高响应速度。
可以使用fastcgi_finish_request()函数集成队列,可以把消息异步发送到队列。
因为这个函数只在FastCGI模式下存在,考虑可移植性可以加上以下代码:
if (!function_exists("fastcgi_finish_request")) {
function fastcgi_finish_request() {
}
}
大家可以根据自己的情况,进行尝试使用。
PHP fastcgi_finish_request 方法的更多相关文章
- register_shutdown_function AND fastcgi_finish_request
在php中又两个方法都是在请求快结束的时候执行.方法名分别是 register_shutdown_function和fastcgi_finish_request.虽然执行的时机差不多,但是功能和应用场 ...
- php分享三十三:用php中的register_shutdown_function和fastcgi_finish_request
已前言 在php中又两个方法都是在请求快结束的时候执行.方法名分别是 register_shutdown_function和fastcgi_finish_request.虽然执行的时机差不多,但是功能 ...
- 妙用php中的register_shutdown_function和fastcgi_finish_request
前言 在php中又两个方法都是在请求快结束的时候执行.方法名分别是 register_shutdown_function和fastcgi_finish_request.虽然执行的时机差不多,但是功能和 ...
- php中的register_shutdown_function和fastcgi_finish_request
在php中又两个方法都是在请求快结束的时候执行.方法名分别是 register_shutdown_function和fastcgi_finish_request.虽然执行的时机差不多,但是功能和应用场 ...
- 【转】2013 PHP技术峰会《Bug Free的PHP开发实践分享》摘录
要想代码写的好,前提配置做的好 error_reporting = E_ALL | E_STRICT display_errors = 测试机设置为 On,生产机设置为 Off display_s ...
- javaSE27天复习总结
JAVA学习总结 2 第一天 2 1:计算机概述(了解) 2 (1)计算机 2 (2)计算机硬件 2 (3)计算机软件 2 (4)软件开发(理解) 2 (5) ...
- php fastcgi_finish_request让你的程序由等待时间,瞬间完成,提高用户体验
当PHP运行在FastCGI模式时,PHP FPM提供了一个名为fastcgi_finish_request的方法.按照文档上的说法,此方法可以提高请求的处理速度,如果有些处理可以在页面生成完后再进行 ...
- 使用fastcgi_finish_request提高页面响应速度
当PHP运行在FastCGI模式时,PHP FPM提供了一个名为fastcgi_finish_request的方法. 按照文档上的说法,此方法可以提高请求的处理速度,如果有些处理可以在页面生成完后再进 ...
- 神奇的fastcgi_finish_request
当PHP运行在FastCGI模式时,PHP FPM提供了一个名为fastcgi_finish_request的方法.按照文档上的说法,此方法可以提高请求的处理速度,如果有些处理可以在页面生成完后再进行 ...
随机推荐
- nginx 修改文件上传大小限制
修改nginx的配置文件,添加client_max_body_size 字段 注:client_max_body_size 必须要放在server下的server_name下,而不是放在locatio ...
- 22(7).模型融合---CatBoost
一.Catboost简介 全称:Gradient Boosting(梯度提升) + Categorical Features(类别型特征) 作者:俄罗斯的搜索巨头Yandex 官方地址 论文链接 | ...
- Java.awt.geom.AffineTransform 的使用
https://docs.oracle.com/javase/8/docs/api/java/awt/geom/AffineTransform.html http://www.cjsdn.net/Do ...
- [译]Vulkan教程(10)交换链
[译]Vulkan教程(10)交换链 Vulkan does not have the concept of a "default framebuffer", hence it r ...
- Leetcode题解 - BFS部分题目代码+思路(896、690、111、559、993、102、103、127、433)
和树有关的题目求深度 -> 可以利用层序遍历 -> 用到层序遍历就想到使用BFS 896. 单调数列 - 水题 class Solution: def isMonotonic(self, ...
- Cypress 之 URL访问
visit 作用: 访问一个远程URL. (建议:使用前设置 baseUrl) 语法: cy.visit(url) cy.visit(url, options) cy.visit(options) 使 ...
- JS中的slice()和splice()的区别以及记忆方式
总结 splice()会改变原来的数组,返回的是被改变的内容,比如说通过splice删掉了某一项,那么返回的是删掉的这一项,当然还是会以数组的形式返回. slice不会对原数组进行改变,会返回一个新的 ...
- springboot架构下运用shiro后在configuration,通过@Value获取不到值,总是为null
通过网上查找资料,是因为shiro的bean @Beanpublic LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { return ...
- SpringCloud之Eureka:服务发布与调用例子
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的. SpringCloud将它集成在其子 ...
- python数据库模块
安装数据库 [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.3/centos7-amd64 gpgkey=https://yu ...