>백엔드 개발 >PHP 튜토리얼 >PHP에서 PHP-FPM이 무엇인지 자세히 설명해주세요. 무슨 소용이 있나요?

PHP에서 PHP-FPM이 무엇인지 자세히 설명해주세요. 무슨 소용이 있나요?

青灯夜游
青灯夜游앞으로
2020-07-17 15:26:2714119검색

PHP에서 PHP-FPM이 무엇인지 자세히 설명해주세요. 무슨 소용이 있나요?

PHP-FPM(PHP FastCGI 프로세스 관리자)은 PHP FastCGI 프로세스 관리자, PHP 프로세스 풀을 관리하고 웹 서버의 요청을 수락하는 데 사용되는 소프트웨어를 의미합니다.

Function

PHP-FPM은 메모리와 프로세스를 효과적으로 제어하고 PHP 구성을 원활하게 다시 로드할 수 있는 더 나은 PHP 프로세스 관리 방법을 제공합니다. [관련 권장 사항: PHP 튜토리얼]

(1). php-fpm이 나타나는 이유는 무엇입니까? fpm이 등장한 것은 모두 php-fastcgi 때문입니다. php-fastcgi를 잘 관리하기 위해 구현한 프로그램

(2) php-fastcgi

php-fastcgi는 관리 없이 PHP 요청만 구문 분석하고 결과를 반환하는 CGI 프로그램일 뿐입니다(그래서 php-fpm이 나타나는 이유입니다).

(3) php-cgi라고 부르면 안되는 이유

사실 php-fastcgi가 등장하기 전에도 php-cgi가 있었지만 실행 효율이 낮아서 php-fastcgi로 대체되었습니다.

(4) fastcgi와 cgi의 차이점은 무엇인가요?

친구 여러분, 서비스 웹 서버(nginx)가 요청을 배포할 때 접미사를 일치시켜 해당 요청이 동적 PHP 요청임을 알고 해당 요청을 PHP로 전달합니다.

CGI 시대에는 요청이 들어온 후 php.ini의 기본 구성 정보를 읽고 실행 환경을 초기화해야 한다는 생각이 비교적 보수적이었습니다. . 환경을 초기화하고, 데이터를 반환하고, 프로세스를 종료합니다. 시간이 지나면 프로세스를 시작하는 작업이 지루해지고 특히 피곤해집니다.

PHP가 5의 시대가 되었을 때, 모든 사람들은 특히 이런 작업 방식에 혐오감을 느꼈습니다. 게으른 사람들은 필사적으로 CGI가 마스터 프로세스(마스터)를 한 번에 시작하게 하고 읽기만 하게 할 수 있을까라고 생각했습니다. 그런 다음 여러 작업자 프로세스(작업자)를 시작하면 요청이 오면 마스터를 통해 작업자에게 전달되므로 작업 중복을 피할 수 있습니다. 그래서 fastcgi가 탄생했습니다.

(5) Fastcgi가 너무 좋은데, 시작한 일꾼이 다 떨어지면 어떻게 해야 하나요?

워커가 충분하지 않으면 마스터는 구성의 정보를 통해 동적으로 워커를 시작하고 유휴 상태일 때 워커를 다시 가져올 수 있습니다.


(6) 아직도 php-fpm이 무엇인지 이해가 안 되나요?

그것은 여러 작업자 프로세스가 포함된 마스터 프로세스와 프로그램을 관리하고 시작하는 것입니다. PHP-FPM은 처리를 위해 HTTP 요청을 하나 이상의 하위 프로세스에 전달하는 시기와 방법을 제어하는 ​​기본 프로세스를 생성합니다.


PHP-FPM 기본 프로세스는 생성(웹 애플리케이션에서 더 많은 트래픽 처리) 및 삭제(하위 프로세스가 너무 오랫동안 실행되었거나 더 이상 필요하지 않음) 시기도 제어합니다.

PHP 하위 프로세스. PHP-FPM 프로세스 풀의 각 프로세스는 단일 HTTP 요청보다 오래 지속되며 10, 50, 100, 500개 이상의 HTTP 요청을 처리할 수 있습니다.

Installation

PHP는 5.3.3 이후 PHP 핵심 코드에 php-fpm을 통합했습니다. 따라서 php-fpm은 별도의 다운로드 및 설치가 필요하지 않습니다. PHP가 php-fpm을 지원하도록 하려면 PHP 소스 코드를 컴파일할 때 --enable-fpm만 포함하면 됩니다.

전역 구성

Centos에서 PHP-FPM의 주요 구성 파일은 /etc/php7/php-fpm.conf입니다. 지정된 하위 프로세스가 지정된 기간 내에 실패하면 PHP-FPM이 다시 시작됩니다.

#在指定的一段时间内,如果失效的PHP-FPM子进程数超过这个值,PHP-FPM主进程将优雅重启。
emergency_restart_threshold = 10

#设定emergency_restart_interval 设置采用的时间跨度。
emergency_restart_interval = 1m

프로세스 풀 구성

PHP-FPM 구성 파일의 나머지 부분은 풀 정의라는 영역입니다. 이 영역에서는 각 PHP-FPM 프로세스 풀에 대한 사용자 설정을 구성합니다. PHP-FPM 프로세스 풀은 일련의 관련 PHP 하위 프로세스입니다. 일반적으로 PHP 애플리케이션에는 자체 프로세스 풀이 있습니다.

Centos는 PHP-FPM 기본 구성 파일 상단에 프로세스 풀 정의 파일을 소개합니다.

include=/etc/php7/php-fpm.d/*.conf

www.conf는 PHP-FPM의 기본 구성 파일입니다. FPM 프로세스 풀.

user= nobody
#拥有这个 PHP-FPM进程池中子进程的系统用户。要把这个设置的值设用的非根用户的用户名。

group = nobody
#拥有这个 PHP-FPM进程池中子进程的系统用户组。要把这个设置的值设应用的非根用户所属的用户组名。

listen=[::]]:9000
#PHP-FPM进程池监听的IP地址和端口号,让 PHP-FPM 只接受 nginx从这里传入的请求。

listen. allowed clients =127.0.0.1
#可以向这个 PHP-FPM进程池发送请求的IP地址(一个或多个)。

pm.max children =51
#这个设置设定任何时间点 PHP-FPM进程池中最多能有多少个进程。这个设置没有绝对正确的值,你应该测试你的PHP应用,确定每个PHP进程需要使用多少内存,然后把这个设置设为设备可用内存能容纳的PHP进程总数。对大多数中小型PHP应用来说,每个PHP进程要使用5~15MB内存(具体用量可能有差异)。 假设我们使用设备为这个PHP-FPM进程池分配了512MB可用内存,那么可以把这个设置设为(512MB总内存)/(每个进程使用10MB) = 51个进程。

...

편집 및 저장하고 PHP-FPM 기본 프로세스를 다시 시작하세요.

sudo systemctl restart php-fpm.service

PHP-FPM 프로세스 풀의 구성 세부정보는 http://php.net/manual/install.fpm.configuration.php를 참조하세요.

회사 개발 환경을 참고하세요

테스트 환경 구성은 다음과 같습니다.

[www]
user = nobody               #进程的发起用户和用户组,用户user是必须设置,group不是  nobody 任意用户
group = nobody

listen = [::]:9000          #监听ip和端口,[::] 代表任意ip
chdir = /app                #在程序启动时将会改变到指定的位置(这个是相对路径,相对当前路径或chroot后的“/”目录) 

pm = dynamic                #选择进程池管理器如何控制子进程的数量  #static: 对于子进程的开启数路给定一个锁定的值(pm.max_children) #dynamic: 子进程的数目为动态的,它的数目基于下面的指令的值(以下为dynamic适用参数)
pm.max_children = 16        #同一时刻能够存货的最大子进程的数量
pm.start_servers = 4        #在启动时启动的子进程数量
pm.min_spare_servers = 2    #处于空闲"idle"状态的最小子进程,如果空闲进程数量小于这个值,那么相应的子进程会被创建
pm.max_spare_servers = 16   #最大空闲子进程数量,空闲子进程数量超过这个值,那么相应的子进程会被杀掉。
catch_workers_output = Yes  #将worker的标准输出和错误输出重定向到主要的错误日志记录中,如果没有设置,根据FastCGI的指定,将会被重定向到/dev/null上
제품 환경 구성:

예를 들어 PHP-FPM

nginx에 요청을 전달합니다.

server {
       listen       83;
       server_name mobile.com;
       root /app/mobile/web/;

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

        location / {
                index  index.html index.htm index.php;
                # Redirect everything that isn't a real file to index.php
                try_files $uri $uri/ /index.php$is_args$args;
        }

        #把HTTP请求转发给PHP-FPM进程池处理
        location ~ .*\.php                 include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass   192.168.33.30:9000;      #监听9000端口
                fastcgi_index  index.php;
                try_files $uri =404;
                #include fastcgi.conf;
        }
        location ~ /\.(ht|svn|git) {
                deny all;
        }
        access_log  /app/wwwlogs/access.log;
        error_log   /app/wwwlogs/error.log;
}
php-fpm 시작, 재시작, 작업 종료

Start php-fpm:

/usr/sbin/php-fpm
或
/usr/local/php/sbin/php-fpm
php 5.3.3 이상 php-fpm은 더 이상 /usr/local/php/sbin과 같은 명령을 지원하지 않습니다. php-fpm이 이전에 가지고 있던 /php-fpm (start|stop|reload) 더 이상 이 구식 명령을 보지 마십시오. 신호 제어를 사용해야 합니다. 마스터 프로세스는 다음 신호를 이해할 수 있습니다

INT, TERM 즉시 종료

QUIT 원활하게 종료

USR1 로그 파일 다시 열기

USR2 모든 작업자를 원활하게 다시 로드 구성 및 바이너리 모듈을 처리하고 다시 로드

간단하고 직접적인 다시 시작 방법:

먼저 PHP의 마스터 프로세스 번호를 확인하세요. -fpm

# ps aux|grep php-fpm
root     21891  0.0  0.0 112660   960 pts/3    R+   16:18   0:00 grep --color=auto php-fpm
root     42891  0.0  0.1 182796  1220 ?        Ss   4月18   0:19 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
nobody   42892  0.0  0.6 183000  6516 ?        S    4月18   0:07 php-fpm: pool www
nobody   42893  0.0  0.6 183000  6508 ?        S    4月18   0:17 php-fpm: pool www

php-fpm 다시 시작:
kill -USR2 42891

위 해결 방법은 일반적으로 php-fpm .pid 파일을 생성하지 않습니다. php-fpm.pid를 생성하려면 다음 해결 방법을 사용하세요.

上面master进程可以看到,matster使用的是/usr/local/php/etc/php-fpm.conf这个配置文件,cat /usr/local/php/etc/php-fpm.conf 发现:

[global]
; Pid file
; Note: the default prefix is /usr/local/php/var
; Default Value: none
;pid = run/php-fpm.pid

pid文件路径应该位于/usr/local/php/var/run/php-fpm.pid,由于注释掉,所以没有生成,我们把注释去除,再kill -USR2 42891 重启php-fpm,便会生成pid文件,下次就可以使用以下命令重启,关闭php-fpm了:

php-fpm 关闭:
kill -INT 'cat /usr/local/php/var/run/php-fpm.pid'
php-fpm 重启:
kill -USR2 'cat /usr/local/php/var/run/php-fpm.pid'

相关学习推荐:PHP编程从入门到精通

위 내용은 PHP에서 PHP-FPM이 무엇인지 자세히 설명해주세요. 무슨 소용이 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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