服务器上我们查看php进程时,全都是php-fpm进程。这就是php的运行环境。但是它是什么东西?
PHP-FPM
PHP-FPM,就是PHP的FastCGI1的管理器,用于替换PHP FastCGI的大部分附加功能,在php5.3.3后成为PHP的标配。
运行php脚本时,php test.php
php-fpm就相当于这个php命令。nginx通过fastcgi_pass来运行php
$nginx_root下的index.php。用各种语音都可以用他们的cgi程序,让nginx调用。
PHP-FPM功能
- 支持平滑重启 用户无感知
- stdout和stdrr日志记录 可以记录输出流
- 可以工作唉不同的环境 uid/gid/chroot,并监听不同的端口和使用不同的php.ini配置文件
- 发生意外也能够重启并缓存被破坏的opcode。2
- 文件上传优化支持
- 慢日志记录脚本。可以记录文件名,PHP追踪异常信息,还能通过ptrace工具读取分析远程进程对的运行数据。运行导致的缓慢
- fastcgi_finish_request()-特殊功能,用于在请求完成和刷新数据后,继续在后台执行耗时的工作。(录入视频转换,统计处理等)
- 动态/静态子进程产生
- 基于SAPI3运行状态信息(类似Apache的mod_status)
- 基于php.ini的配置文件
一个具有注脚的文本
cgi缺点 每次来一个请求都会生成一个进程来解析web请求,并发量稍微一大,资源就消耗的很严重。 这时候fastcgi就是来解决这个问题的
fastcgi是一个常驻的协议,不会每次有请求都再重新生成进程,它是提前会生成好一些进程。这些进程可以是固定的也可以是动态维护的。
php-fpm相当于是fastcgi的实现,相当于一个进程管理器。它管理的是php-cgi,php-cgi没有进程管理功能,他只负责处理请求,来了就处理。
php-fpm可以管理php-cgi,来控制能生成多少个进程,每个进程处理多少请求,就可以销毁。
FastCGI 像是一个常驻 (long-live) 型的 CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去 fork 一次。FastCGI是启动一个socket接口,服务器应用不需要自己去运行php,只需要向这个socket接口提交请求就可以。
CGI(Common Gateway Interface)公共网关接口,就是让Web服务器和你的应用程序进行交互的一个接口。就像nginx中需要配置的fastcgi_pass,一般我们会是用127.0.0.1:9000或者unix:/tmp/php-cgi.sock来配置这个参数。它的意思就是告诉nginx,过来的请求会用tcp:9000端口的监听程序来处理或者使用unix/socket来处理。他们都是指向的PHP运行程序。CGI
php与nginx的通信方式
tcp socket方式是ip加端口 可以跨服务器
unix socket不经过网络,只能用于nginx跟php-fpm都在一台服务器的场景。
tcp socket 与 unix socket 配置都需要改
nginx.conf 配置fastcgi_pass php-fpm.conf 会监听端口
服务器设计之初是给用户提供静态资源的。然后随着计算机技术的发展和需求。开始需要和数据库,来交互,然后就出现编程语言,php,go,java。但是服务器不知道怎么解析这些语言。但是他们的解析器知道怎么解析。
那现在好办了,nginx就只要知道是啥语言就行了。这就引出来cgi了。
cgi是通用网关协议,它是用来规定web服务器和相应动态语言的解析器之间通信的一种协议。
php-cgi就相当于php的解析器。在window系统下就是php.exe文件,在linux下就是php的二进制文件。
web服务器请求->cgi协议传给php-cgi->php代码 ↩︎机内码、操作码,也就是指令序列号,用来告诉CPU需要执行哪一条指令。英文OPERATING CODE ↩︎
这篇说了SAPI
常见的提供给apache和nginx的php5_module,CGI,FastCGI,给IIS的ISAPI,以及Shell的CLI。
意思是服务器端应用编程接口(apache->httpd<->sapi->php)。
这是 PHP 内核提供给外部调用其服务的接口,即外部系统可以通过 SAPI 来调用 PHP 提供的编译脚本、执行脚本的服务。
apache 运行php时,就是先用LoadModule来加载php5_module,把php作为apache的一个子模块来运行,当web访问php时,apache就会调用php5_module来解析php代码,php5_module就是将数据通过sapi传给php的解析器来解析php代码(ps:这种将php模块安装到apache中,每一次apache请求,都会产生一条进程,这个进程就完整的包括php的各种运算计算等,apache每接收一个请求,都会产生一个进程来连接php通过sapi来完成请求,用户一旦很多,并发数过多,服务器就会承受不住,而且php当做一个模块加载到apache中,出问题很难定位是php的问题还是apache的问题) ↩︎