ホームページ  >  記事  >  バックエンド開発  >  この記事では、PHP-FMP の詳細な分析を提供します。

この記事では、PHP-FMP の詳細な分析を提供します。

青灯夜游
青灯夜游転載
2021-06-08 18:40:492788ブラウズ

この記事では、PHP-FMP について詳しく説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。

この記事では、PHP-FMP の詳細な分析を提供します。

php-fpm とは

  • php-fpm を理解する前に、まず質問について考えてください。ユーザーが PHP コードで Web (niginx サーバー) リクエストを開始した場合、$_POST、$_GET、$_SERVER を通じてリクエスト情報を取得するにはどうすればよいでしょうか?データを組み立てるにはどのような形式を参照すればよいでしょうか?

実際、各動的言語、つまりインタープリタ言語は、サーバー (ここでは Web サーバーを指します) に認識されるように、対応するパーサーを渡す必要があることがわかっていますが、インタープリターとサーバーは特定のプロトコルに従う必要があります。このプロトコルを介してのみ、両者は正常に通信できます。この場合、このプロトコルは CGI プロトコルですが、CGI のメカニズムは、Web リクエストに応答するたびに、新しい処理プロセスが作成され、初期化されます。このプロセスは、リクエストが完了すると強制終了されます。次に、各リクエストは、作成 -> 初期化 -> 終了の 3 つのステップを実行する必要があります。実際、このプロセスはリソースを無駄にするだけでなく、非常に非効率的です。何をするか? FastCGI は、時代に合わせて登場し、CGI の改良版として、ライフサイクル管理が不要な常駐サービスプロセスを起動し、プロセスの作成と終了を繰り返すことを回避します。繰り返し読み込む必要はありません 環境変数を取得します Webリクエストがあるたびに、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 ははるかに遅れているのでしょうか? もちろん違います、2004 年までに Andrei という男がNigmatulin 敗者が PHP-FPM を発明しました。PHP-FMP の正式名は PHP-FASTCGI Process Manager です。端的に言えば、FastCGI を PHP 用にカスタマイズしたバージョンです (ここで強調したいのは、PHP-CGI と PHP の両方であることです) -FPM は CGI プロトコルを実装するように設計されており、新しいプロトコルではありません)。実際、今私が言っていなかったことが 1 つあります。インターネット上の多くの人は、PHP-CGI は PHP のためのプログラムであると言っています。 FAST-CGI を管理する PHP-FMP の正式名は PHP-FASTCGI Process であることがわかりました。マネージャーになった後は、自信を持って FAST-CGI にノーと言え、この知識を広めることができます。

php-fpm のプロセスにはマスター (常駐サービス プログラム) とワーカー プロセスが含まれます

マスター プロセス
  • マスターはプロセスのスケジューリングを担当します (たとえば、十分なワーカー プロセスがない場合、子プロセスをフォークします)
  • はリスニング ポート (通常は 9000) を担当します。これは構成で設定できます。もちろん、別の方法もあります。ソケットを使用する方法もあります。netstat -nap | grep マスターのプロセス番号 でポート情報を確認できます (ポート 9000 は実際には tcp の通信方式で、ソケットはUnix ソケット。プロセス間の通信であるため、効率の点では Unix ソケットが明らかに最高ですが、Unix ソケットはサーバー上にある必要があります。異なるマシン間の通信の場合は、やはり tcp 通信を使用する必要があります)

この記事では、PHP-FMP の詳細な分析を提供します。

この記事では、PHP-FMP の詳細な分析を提供します。

  • サーバーからリクエストを受信します
#次のことからわかります。作業の進行状況の名前です。実際の作業クラスです。コードが実際に実行される場所です。

この記事では、PHP-FMP の詳細な分析を提供します。

  • php-fmp の仕組みを見てみましょう。
# 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 はすべてのワーカー プロセスをスムーズにリロードし、構成モジュールとバイナリ モジュールをリロードします

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

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