还在说PHP-CGI是PHP的FastCGI管理器?错!带你一步

2021-06-01  本文已影响0人  张清柏

什么是php-fpm

image.png

1.修改php.ini 后必须重启PHP-CGI才可以生效,而不能实现平滑重启
2.直接干掉PHP-CGI,php就不能运行了,这显然是不能接受的
3.这玩意不会自己管理进程,它只能解析请求,返回结果

那么FastCGI都已经到来了,php的FastCGI还会远吗,当然不会,到 2004年一个叫 Andrei Nigmatulin的屌丝发明了PHP-FPM,PHP-FMP 全名叫做PHP-FASTCGI Process Manager,说白了就是php定制版的FastCGI(这里强调一下,不管是PHP-CGI 还是 PHP-FPM都是为了实现CGI协议,而不是一种新的协议),其实有一句话刚才我没说,网上很多人说PHP-CGI 就是 php管理FAST-CGI的一种程序,那你现在知道了PHP-FMP 全名叫做PHP-FASTCGI Process Manager之后,你可以理直气壮的跟他们说no,并给他们普及一下这个知识点了。

php-fpm的进程包括 master(常驻服务程序)和worker进程两种

master进程
image.png image.png
work进度 看名字就知道了,就是真正的打工阶级,代码真正执行的地方
image.png
        location ~ [^/]\.php(/|$)
        {
            try_files $uri =404;
            fastcgi_pass  unix:/tmp/php-cgi.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
        }

相信这段信息大家都可以看明白,/tmp/php-cgi.sock 就是php和nginx联系的桥梁,同时我们也看到了include fastcgi.conf,我们来看一下

root@6d05153a8988:/usr/local/nginx/conf# cat fastcgi.conf

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
fastcgi_param PHP_ADMIN_VALUE "open_basedir=NULL";

我们看到了一些熟悉的,比如REMOTE_ADDR,REQUEST_URI,现在你应该明白了,我们通过$_SERVER获取到的信息就是这个配置文件里面指定的

我们再来看一下php-fmp的配置文件(请注意看里面的注释,我不做解释了)


root@6d05153a8988:/usr/local/php/etc# cat php-fpm.conf
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice

[www]
listen = /tmp/php-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
# 如何控制子进程,选项有static和dynamic
#区别:
#如果dm设置为 static,那么其实只有pm.max_children这个参数生效。系统会开#启设置数量的php-fpm进程。
#如果dm设置为 dynamic,那么pm.max_children参数失效,后面3个参数生效。
#系统会在php-fpm运行开始 的时候启动pm.start_servers个php-fpm进程,
#然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之#间调整php-fpm进程数。
pm = dynamic
# 静态方式下开启的php-fpm进程数量
pm.max_children = 20
# 动态方式下的起始php-fpm进程数量
pm.start_servers = 10
# 动态方式下的最小php-fpm进程数
pm.min_spare_servers = 10
# 动态方式下的最大php-fpm进程数量
pm.max_spare_servers = 20
# php-fpm子进程能处理的最大请求数
pm.max_requests = 1024
pm.process_idle_timeout = 10s
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log

INT, TERM
QUIT 平滑终止
USR1 重新打开日志文件
USR2 平滑重载所有worker进程并重新载入配置和二进制模块

启动: /usr/local/php/sbin/php-fpm
查看进程数: ps aux | grep -c php-fpm
查看mater进程号:ps aux|grep 'php-fpm: master'|grep -v grep|awk '{print $2}' 或者cat /usr/local/php/var/run/php-fpm.pid

# 强制关闭
pkill php-fpm

kill -INT `cat /usr/local/php/var/run/php-fpm.pid` 
kill -INT [pid]

# 平滑重启 其实就是通过创建新的进程使 php.ini 生效
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
kill -USR2 [pid]
小结

至此,php-fpm 算是说完了,其实通过上面的解说,大家也会明白一个问题,为什么lnmp 承受的并发比lamp高,除了nginx的高性能之外,php-fpm 是不是也是其中的一个原因呢?

上一篇 下一篇

猜你喜欢

热点阅读