ホームページ >バックエンド開発 >PHPチュートリアル >PHPのPHP-FPMとは何かを詳しく解説!用途は何ですか?

PHPのPHP-FPMとは何かを詳しく解説!用途は何ですか?

青灯夜游
青灯夜游転載
2020-07-17 15:26:2714104ブラウズ

PHPのPHP-FPMとは何かを詳しく解説!用途は何ですか?

PHP-FPM (PHP FastCGI Process Manager) とは、PHP FastCGI プロセス マネージャーを意味します。PHP プロセス プールを管理し、Web サーバーからのリクエストを受け入れるために使用されるソフトウェアです。

機能

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 の違いは何ですか?

親愛なる皆さん、その違いは非常に大きいです. サービス Web サーバー (nginx) がリクエストを配布するとき、サフィックスを照合することでリクエストが動的 php リクエストであることを認識し、リクエストを php に転送します。

CGI の時代は比較的保守的な考え方で、リクエストが来るたびに php.ini の基本設定情報を読み込み、実行環境を初期化し、プロセスを作成するというものでした。構成、環境の初期化、データの返し、プロセスの終了など、時間が経つにつれて、プロセスを開始する作業は退屈で特に疲れるものになります。

PHP 5 の時代になると、誰もがこの作業方法に特に嫌悪感を抱き、怠惰になりたい人は、CGI に一度に 1 つのメイン プロセス (マスター) を開始させて、読み取り専用にしますか? 構成を一度取得して、複数のワーカー プロセスを開始します。リクエストが来ると、作業の重複を避けるために、リクエストはマスター経由でワーカーに渡されます。そこで、fastcgi が誕生しました。

(5) Fastcgi は非常に優れていますが、開始したワーカーがなくなったらどうすればよいですか?

十分なワーカーがない場合、マスターは構成内の情報を通じて動的にワーカーを開始し、アイドル状態になったワーカーを取り戻すことができます


(6) まだ意味がわかりませんphp-fpm とは?

マスター プロセスと複数のワーカー プロセスを開始するプログラムを管理するためのものです。PHP-FPM は、処理のために HTTP リクエストを 1 つ以上の子プロセスに転送するタイミングと方法を制御するメイン プロセスを作成します。


PHP-FPM メイン プロセスは、

PHP 子プロセスをいつ作成するか (Web アプリケーションからのより多くのトラフィックを処理する)、破棄するか (子プロセスの実行時間が長すぎるか、不要になるか) も制御します。 PHP-FPM プロセス プール内の各プロセスは、単一の HTTP リクエストよりも長く存在し、10、50、100、500、またはそれ以上の HTTP リクエストを処理できます。

インストール

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 プロセス プールのデフォルト構成ファイル です。

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 (start|stop|reload) やその他のコマンドの前に php-fpm にあったので、この昔ながらのコマンドはもう見ないでください。シグナル制御を使用する必要があります。 マスター プロセスは次の信号を理解できます

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。