1.PHP-FPM详解
2.å¦ä½è®©lighttpdçspawn-fcgièªå¯å¨
3.PHP源码分析FastCGI协议浅析
4.如何启动一个fcgi的码分c程序 ,在cherokee服务器中?
PHP-FPM详解
PHP-FPM,码分全称为PHP FastCGI Process Manager,码分是码分一个用于管理PHP进程池的软件,专门用于接收web服务器的码分请求。它提供了一种更有效的码分娜迦源码PHP进程管理方式,可以优化内存和进程管理,码分实现平滑重载PHP配置。码分
PHP-FPM的码分出现源于对php-fastcgi的需求。php-fastcgi是码分一个只解析PHP请求并返回结果的CGI程序。随着需求的码分增长,为了更好地管理php-fastcgi,码分PHP-FPM应运而生。码分
在CGI年代,码分每次请求都需要读取配置信息并初始化执行环境,码分这导致了频繁的进程创建和销毁。随着PHP进入5时代,人们开始尝试优化这种工作方式。通过引入一次启动主进程(master)和多个工作进程(worker)的模式,可以减少重复劳动。这样,当请求到来时,master进程会传递给worker进程处理,大大提高了效率。
当使用fastcgi时,如果worker进程数量不足,spacex源码master进程会根据配置信息动态启动更多worker进程。当空闲时,可以收回worker进程,实现资源的高效利用。
PHP-FPM不仅仅是一个程序,它是一个完整的解决方案,包括主进程和多个子进程的管理。主进程负责控制何时创建和销毁子进程,以及处理更多或更少的HTTP请求。子进程可以处理、、、或更多的HTTP请求,而整个进程池的生命周期通常比单个HTTP请求要长。
在安装方面,从PHP 5.3.3版本开始,PHP-FPM已经集成到了PHP的核心代码中,不需要单独下载安装。若要使PHP支持PHP-FPM,只需要在编译PHP源码时使用`--enable-fpm`选项即可。
在配置方面,Centos中的PHP-FPM主配置文件通常是`/etc/php7/php-fpm.conf`。配置文件中定义了在一段时间内有多少个子进程失效后,PHP-FPM会自动重启。此外,thingjs 源码配置文件还包括配置进程池的部分,通常为每个PHP应用设置一个独立的进程池。
在Centos中,PHP-FPM的配置文件顶部通常引入了进程池定义文件,例如`www.conf`。为了进行配置,需要编辑并保存文件,然后重启PHP-FPM主进程。关于更多详细配置信息,可以查阅`php.net/manual/install`。
在实际应用中,需要考虑PHP-FPM的最大进程数、nginx的并发数(作为代理服务器的角色)、内存占用、CPU开销以及服务器的QPS(每秒处理请求数)等参数。QPS和并发量的计算方法如下:服务器的QPS = 平均请求连接数 * (1/响应时间),并发量 = 有效时间 * QPS。
希望以上内容能够帮助大家理解PHP-FPM在服务器和应用性能优化中的作用。对于进阶的PHP开发者,我整理了一些资料,涵盖了分布式架构、高可扩展性、高性能、高并发处理、服务器性能调优、concatenate源码TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等高级进阶知识点,有需要的开发者可以免费获取,获取链接如下:[PHP进阶架构师实战视频、大厂面试文档免费获取](链接)
å¦ä½è®©lighttpdçspawn-fcgièªå¯å¨
ä¿®æ¹ç¼è¯spawn-fcgiå 为ç¨spawn-fcgi å¯å¨åä¸è½å -u root å¯å¨FastCGIè¿ç¨ãæ以修æ¹äºæºä»£ç ï¼ä¸è½½ä»£ç [plain]wget download/spawn-fcgi/releases-1.6.x/spawn-fcgi-1.6.3.tar.gz 解ååè¿å ¥ç®å½ï¼å¨æ件src/spawn-fcgi.cä¸æ³¨éæä¸æ®µä»£ç ï¼[plain]/* if (my_uid == 0) { fprintf(stderr, spawn-fcgi: I will not set uid to 0/n); return -1; } */ 类似çè¿æ两å¤è¦æ³¨éãè¿è¡./configureç¶åç¼è¯makemake installmake install ä¸å¤§çµå ï¼æå¨æ·è´å§ãç°å¨åè¯è¯çï¼æå®äºã
PHP源码分析FastCGI协议浅析
FastCGI协议是一种建立在CGI/1.1基础上的协议,用于在Web服务器和应用程序之间传递数据。其核心作用是优化Web应用的性能,简化开发流程,提高资源利用效率。
FastCGI协议分为种类型的消息,包括FCGI_BEGIN_REQUEST、FCGI_PARAMS、FCGI_STDIN、FCGI_STDOUT、FCGI_STDERR和FCGI_END_REQUEST等。pythoncsgo源码消息类型定义了数据传输的顺序和格式,以及请求和响应的开始与结束。请求通常以FCGI_BEGIN_REQUEST类型开始,然后是FCGI_PARAMS和FCGI_STDIN消息,处理完成后发送FCGI_STDOUT和FCGI_STDERR,最后以FCGI_END_REQUEST结束。
每个消息类型都以一个统一结构的消息头开始,包括requestId、contentLength和paddingLength等关键字段。requestId用于标识请求的唯一性,内容长度表示消息体的数据大小,paddingLength则用于填充发送的数据,以实现更有效的数据处理。
FCGI_BEGIN_REQUEST消息包含Web服务器期望应用扮演的角色信息,通常在PHP7中处理FCGI_RESPONDER、FCGI_AUTHORIZER和FCGI_FILTER三种角色。flags & FCGI_KEEP_CONN字段表示是否在响应后关闭连接。
对于FCGI_PARAMS类型的消息,FastCGI协议提供了名-值对结构,用于处理可变长度的name和value。这种结构可以节省空间,并且支持表示0至2的次方长度的数据。
FastCGI协议的请求结构体包含了所有请求消息的定义。通过访问对应接口、使用gdb抓取消息内容、修改php-fpm.conf参数并重新启动php-fpm,可以深入分析FastCGI协议的实际应用。
通过浏览器访问nginx,nginx将请求转发到php-fpm的worker。使用gdb可以打印出FastCGI消息内容,例如FCGI_BEGIN_REQUEST和FCGI_PARAMS消息。根据协议定义和消息结构,可以分析出请求的详细信息,如角色、内容长度等。处理完请求后,FastCGI协议会发送FCGI_END_REQUEST消息,完成请求的响应过程。
FCGI_END_REQUEST消息由fcgi_finish_request函数调用fcgi_flush函数生成,再通过safe_write写入socket连接的客户端描述符。至此,完全掌握了FastCGI协议的原理和操作。
如何启动一个fcgi的c程序 ,在cherokee服务器中?
CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。
CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等
什么是FastCGI
FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。
FastCGI与CGI特点
1、如CGI,FastCGI也具有语言无关性.
2、如CGI, FastCGI在进程中的应用程序,独立于核心web服务器运行,提供了一个比API更安全的环境。(APIs把应用程序的代码与核心的web服务器链接在一起,这意味着在一个错误的API的应用程序可能会损坏其他应用程序或核心服务器; 恶意的API的应用程序代码甚至可以窃取另一个应用程序或核心服务器的密钥。)
3、FastCGI技术目前支持语言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相关模块在Apache, ISS, Lighttpd等流行的服务器上也是可用的。
4、如CGI,FastCGI的不依赖于任何Web服务器的内部架构,因此即使服务器技术的变化, FastCGI依然稳定不变。
FastCGI的工作原理
1、Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)
2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。
在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。
FastCGI的不足
因为是多进程,所以比CGI多线程消耗更多的服务器内存,PHP-CGI解释器每进程消耗7至兆内存,将这个数字乘以或就是很大的内存数。
Nginx 0.8.+PHP 5.2.(FastCGI)服务器在3万并发连接下,开启的个Nginx进程消耗M内存(M*=M),开启的个php-cgi进程消耗M内存(M*=M),加上系统自身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,完全可以只开启个php-cgi进程,这样php-cgi消耗的总内存数才M。
什么是PHP-CGI
PHP-CGI是PHP自带的FastCGI管理器。
启动PHP-CGI,使用如下命令:
1
php-cgi -b .0.0.1:
PHP-CGI的不足
1、php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启
2、直接杀死php-cgi进程,php就不能运行了。(PHP-FPM和Spawn-FCGI就没有这个问题,守护进程会平滑从新生成新的子进程。)
什么是PHP-FPM
PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download下载得到.
PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。
现在我们可以在最新的PHP 5.3.2的源码树里下载得到直接整合了PHP-FPM的分支,据说下个版本会融合进PHP的主分支去。相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。
PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多有点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。