Home >Backend Development >PHP Tutorial >This article will give you an in-depth analysis of PHP-FMP

This article will give you an in-depth analysis of PHP-FMP

青灯夜游
青灯夜游forward
2021-06-08 18:40:492811browse

This article will give you a detailed introduction to PHP-FMP. It has certain reference value. Friends in need can refer to it. I hope it will be helpful to everyone.

This article will give you an in-depth analysis of PHP-FMP

What is php-fpm

  • Before understanding php-fpm, please think about a question first, a The user initiated a web (niginx server) request in the php code, so how can we obtain some request information through $_POST, $_GET, $_SERVER? What format should we refer to to assemble data?

In fact, we know that each dynamic language, that is, interpreted language, needs to pass the corresponding parser to be recognized by the server (here refers to the web server), but the interpreter and server must follow certain Only through this protocol can the two parties communicate normally, then this protocol is the CGI protocol, but the mechanism of CGI is that every time it responds to a web request, a new processing process will be created and initialized, and this process will be killed when the request is completed. Then each request must execute these three steps: Create->Initialize->End. In fact, this process not only wastes resources, but is also very inefficient. What to do? FastCGI emerged in response to the times. As an improved version of CGI, FastCGI will start a resident service process. This process does not need to manage the life cycle, thus avoiding the repeated creation and termination of the process. On the other hand, there is no need for repeated reading. Get the environment variable. Whenever there is a web request, the FastCGI manager, that is, the resident service process, starts the CGI interpreter process

This article will give you an in-depth analysis of PHP-FMP

  • Okay, Now that CGI is available, for these interpreted languages, such as php phython, you have to make an adaptation according to your own language. Then PHP officials came up with PHP-CGI, PHP's customized version of CGI.
  • But with the use, everyone discovered the problem of PHP-CGI

1. After modifying php.ini, you must restart PHP-CGI to take effect, and smooth restart cannot be achieved. 2. If you directly kill PHP-CGI, php will not be able to run. This is obviously unacceptable. 3. This thing will not manage the process by itself, it can only parse the request and return the result

So FastCGI has arrived, will PHP’s FastCGI be far behind? Of course not, by 2004 a man named Andrei Nigmatulin The loser invented PHP-FPM. The full name of PHP-FMP is PHP-FASTCGI Process Manager. To put it bluntly, it is a customized version of FastCGI for PHP (I would like to emphasize here that both PHP-CGI and PHP-FPM are designed to implement the CGI protocol, and It is not a new protocol). In fact, there is one thing I didn’t say just now. Many people on the Internet say that PHP-CGI is a program for PHP to manage FAST-CGI. Now you know that the full name of PHP-FMP is PHP-FASTCGI Process. After becoming Manager, you can confidently say no to them and spread this knowledge to them.

The process of php-fpm includes master (resident service program) and worker process

master process
  • The master is responsible for process scheduling (for example, when there are not enough worker processes, it will fork a child process)
  • is responsible for the listening port, usually 9000, which can be set in the configuration file. Of course, there is another One way is to use socket. You can check the port information through netstat -nap | grep master's process number (Port 9000 is actually the communication method of tcp, and socket is the unix socket. In terms of efficiency, Unix socket is obviously the best, because it is communication between processes, but Unix socket must be on a server. If it is communication between different machines, tcp communication must still be used)

This article will give you an in-depth analysis of PHP-FMP

This article will give you an in-depth analysis of PHP-FMP

  • Receive the request from the server
You can tell by the name of the work progress, it is the real The working class, where the code is actually executed

This article will give you an in-depth analysis of PHP-FMP

  • Let’s take a look at how php-fmp and nignx communicate

Taking socker communication as an example, in the conf file of nginx, you can see the following information

        location ~ [^/]\.php(/|$)
        {
            try_files $uri =404;
            fastcgi_pass  unix:/tmp/php-cgi.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
        }

I believe everyone can understand this information, /tmp/php-cgi.sock is the connection between php and nginx bridge, and we also saw include fastcgi.conf, let’s take a look at

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";

We saw some familiar ones, such as REMOTE_ADDR, REQUEST_URI, now you should understand, we pass The information obtained by $_SERVER is the one specified in this configuration file

Let’s take a look at the php-fmp configuration file (please pay attention to the comments inside, I won’t explain it)

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
  • About php-fpm related operations

INT, TERM QUIT smooth termination USR1 reopens the log file USR2 smoothly reloads all worker processes and reloads configuration and binary modules

启动: /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视频教程

The above is the detailed content of This article will give you an in-depth analysis of PHP-FMP. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:juejin.cn. If there is any infringement, please contact admin@php.cn delete