>  기사  >  백엔드 개발  >  이 기사에서는 PHP-FMP에 대한 심층 분석을 제공합니다.

이 기사에서는 PHP-FMP에 대한 심층 분석을 제공합니다.

青灯夜游
青灯夜游앞으로
2021-06-08 18:40:492694검색

이 글에서는 PHP-FMP에 대해 자세히 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

이 기사에서는 PHP-FMP에 대한 심층 분석을 제공합니다.

php-fpm이란 무엇입니까

  • php-fpm을 이해하기 전에 먼저 질문에 대해 생각해 보십시오. 사용자가 PHP 코드에서 웹(niginx 서버) 요청을 시작했는데 어떻게 해야 할까요? $_POST,$_GET,$_SERVER를 통해 요청 정보를 얻을 수 있나요? 데이터를 조합하려면 어떤 형식을 참조해야 합니까?

사실 각 동적 언어, 즉 해석된 언어는 서버(여기서는 웹 서버)에서 인식되기 위해서는 해당 파서가 필요하다는 것을 우리는 알고 있지만, 인터프리터와 서버는 특정 프로토콜을 따라야 합니다. 정상적인 통신을 위해 이 프로토콜은 CGI 프로토콜이지만 CGI의 메커니즘은 웹 요청에 응답할 때마다 새로운 처리 프로세스가 생성 및 초기화되고 요청이 완료되면 해당 프로세스가 종료된다는 것입니다. 완전한. 그런 다음 각 요청은 생성->초기화->종료의 세 단계를 수행해야 합니다. 실제로 이 프로세스는 리소스를 낭비할 뿐만 아니라 매우 비효율적입니다. 무엇을 해야 할까요? FastCGI는 시대에 부응하여 등장했습니다. FastCGI는 상주 서비스 프로세스를 시작합니다. 이 프로세스는 프로세스의 반복적인 생성과 종료를 방지합니다. 반복해서 읽을 필요가 없습니다. 웹 요청이 있을 때마다 상주 서비스 프로세스인 FastCGI 관리자가 CGI 인터프리터 프로세스를 시작합니다.

이 기사에서는 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가 훨씬 뒤처지겠습니까? 물론 그렇지 않습니다. 이것은 Andrei Nigmatulin이라는 패배자가 발명한 것입니다. 2004년 PHP-FPM의 전체 이름인 PHP-FMP는 PHP-FASTCGI 프로세스 관리자입니다. 직설적으로 말하면 PHP용 FastCGI의 사용자 정의 버전입니다. 여기서는 PHP-CGI와 PHP-FPM이 모두 동일하다는 점을 강조하고 싶습니다. 새로운 프로토콜이 아닌 CGI 프로토콜을 구현하기 위해) 사실 제가 지금 말하지 않은 것이 하나 있습니다. 인터넷에서 많은 사람들이 PHP-CGI는 PHP가 FAST-CGI를 관리하는 프로그램이라고 말합니다. 당신은 PHP-FMP의 전체 이름이 PHP-FASTCGI Process Manager라는 것을 알고 있습니다. 당신은 자신있게 거절하고 이 지식을 전파할 수 있습니다.

php-fpm 프로세스에는 마스터(상주 서비스 프로그램) 및 작업자 프로세스가 포함됩니다.

마스터 프로세스
  • 마스터는 프로세스 예약을 담당합니다(예: 작업자 프로세스가 충분하지 않은 경우 하위 프로세스 포크).
  • 포트 모니터링을 담당하며 일반적으로 포트 9000을 구성 파일에서 설정할 수 있습니다. 물론 소켓을 통하는 다른 방법도 있습니다. netstat -nap | 번호 포트 정보 (포트 9000번은 실제로 tcp의 통신 방식이고 소켓은 유닉스 소켓을 의미합니다. 프로세스 간 통신이기 때문에 효율성 측면에서는 유닉스 소켓이 가장 좋지만 유닉스 소켓은 반드시 보장되어야 합니다. 동일한 포트에 있어야 합니다. 다른 시스템 간의 통신인 경우에는 여전히 TCP 통신을 사용해야 합니다.)netstat -nap | grep master的进程号 查看端口信息(9000端口其实就是tcp的通信方式,而socket是说的unix socket,从效率上来说,unix socket显然是最好的,因为它是进程之间的通信,但是unix socket要保证是在一台服务器,如果是不同机器之间的通信,还是要使用tcp通信)

이 기사에서는 PHP-FMP에 대한 심층 분석을 제공합니다.

이 기사에서는 PHP-FMP에 대한 심층 분석을 제공합니다.

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

이 기사에서는 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

이 기사에서는 PHP-FMP에 대한 심층 분석을 제공합니다.

이 기사에서는 PHP-FMP에 대한 심층 분석을 제공합니다.

  • 서버에서 요청받기

작품명으로 알 수 있어요 진행, 당신은 실제 노동자 계급입니다. 코드가 실제로 실행되는 곳

🎜🎜이 기사에서는 PHP-FMP에 대한 심층 분석을 제공합니다. 🎜🎜🎜php-fmp와 nignx가 어떻게 통신하는지 살펴보겠습니다🎜🎜🎜 Socker 통신을 예로 들면, nginx의 conf 파일에서 다음을 볼 수 있습니다. information🎜
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";
🎜이 정보는 누구나 이해할 수 있을 거라 믿습니다. /tmp/php-cgi.sock은 php와 nginx 사이의 연결고리입니다. 동시에 include fastcgi.conf도 봤습니다. 살펴보겠습니다🎜
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
🎜예를 들어 REMOTE_ADDR, REQUEST_URI와 같은 익숙한 항목을 보았습니다. 이제 $_SERVER를 통해 얻는 정보가 이 구성 파일에 지정된 정보라는 것을 이해해야 합니다🎜🎜php- fmp 구성 파일 (안에 있는 설명에 주의하세요. 설명하지 않겠습니다.) )🎜
# 强制关闭
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 관련 작업에 대해🎜🎜🎜INT, TERM QUIT 원활한 종료 USR1이 로그 파일을 다시 엽니다. USR2는 모든 작업자 프로세스를 원활하게 다시 로드하고 구성 및 바이너리 모듈을 다시 로드합니다🎜

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

위 내용은 이 기사에서는 PHP-FMP에 대한 심층 분석을 제공합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제