最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 还在说PHP-CGI是PHP的FastCGI管理器?错!带你一步一步深剖PHP-FMP

    正文概述 转载于:掘金(老A技术联盟)   2021-06-02   451

    什么是php-fpm

    • 在了解php-fpm之前,请大家先思考一个问题,一个用户发起了一个web(niginx服务器)请求,在php代码里面,那么我们怎么样才可以通过 $_POST,$_GET,$_SERVER获取一些请求信息呢?我们应该参照什么格式去组装数据呢?

    其实我们知道,每种动态语言,也就是解释性语言,都需要通过对应的解析器才能被服务器(这里指web服务器)识别,但是解释器和服务器 必须遵循某种协议,双方才能够正常通信,那么这种协议就是CGI协议,但是CGI的机制是每响应一次web请求,都会创建和初始化一个新的处理进程,请求结束就kill掉这个进程。那每次请求,都要执行这三步 创建->初始化->结束,那其实这个过程不仅浪费了资源,而且效率也很低。那怎么办?FastCGI应时而生,作为CGI的改良版本,FastCGI会启动一个常驻服务进程,这个进程不需要管理生命周期,也就避免了进程的重复的创建和结束,另一方面,不需要再重复的读取环境变量,每当有web请求过来,由FastCGI管理器,也就那个常驻服务进程去启动CGI解释器进程

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

    • 好了,既然有了CGI,那么针对这些解释性语言,比如php phython,都要根据自己的语言做一个适配吧。那么php官方就弄出来了PHP-CGI,php定制版的CGI。
    • 但是随着使用,大家发现了PHP-CGI的问题

    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进程
    • master负责进程的调度(比如worker进程不够的时候去fork一个子进程)
    • 负责监听端口,一般是9000这个端口,可以在配置文件里面设置,当然,还有另外一种方式,就是通过socket,可以通过netstat -nap | grep master的进程号 查看端口信息(9000端口其实就是tcp的通信方式,而socket是说的unix socket,从效率上来说,unix socket显然是最好的,因为它是进程之间的通信,但是unix socket要保证是在一台服务器,如果是不同机器之间的通信,还是要使用tcp通信)

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

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

    • 接收来自服务器的请求
    work进度 看名字就知道了,就是真正的打工阶级,代码真正执行的地方

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

    • 再来看看php-fmp和nignx是怎么通信的

    以socker通信为栗子,nginx的conf文件里面,可以看到下面这段信息

            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
    
    
    • 关于php-fpm 的相关操作

    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 是不是也是其中的一个原因呢?


    起源地下载网 » 还在说PHP-CGI是PHP的FastCGI管理器?错!带你一步一步深剖PHP-FMP

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元