システム開発 - php-cliとphp-fpmの違いについて

 

前回のPHPのモジュールの確認とインストールでは、PHPのインストールを行った際に、インストールされたモジュールや依存ファイルについて確認し、また、実際にmbstringモジュールのインストールを行ってみました。

phpをインストールした際に依存ファイルとしてインストールされたファイルの一覧は下記になります。

[ec2-user@ip-10-0-10-127 /]$ sudo yum list installed | grep php8.0
php-cli.x86_64                        8.0.25-1.amzn2                 @amzn2extra-php8.0
php-common.x86_64                     8.0.25-1.amzn2                 @amzn2extra-php8.0
php-fpm.x86_64                        8.0.25-1.amzn2                 @amzn2extra-php8.0
php-mysqlnd.x86_64                    8.0.25-1.amzn2                 @amzn2extra-php8.0
php-pdo.x86_64                        8.0.25-1.amzn2                 @amzn2extra-php8.0
[ec2-user@ip-10-0-10-127 /]$ 

上記のうち、「php-cli」と「php-fpm」の二つのファイルについては確認がまだできていません。

今回は前回とりあげきれなかった「php-cli」と「php-fpm」についてみていきます。

これらはともにPHPを実行することができるファイルですが、役割が異なります。その違いについて確認していきます。

環境

[ec2-user@ip-10-0-10-127 /]$ httpd -v
Server version: Apache/2.4.54 ()
Server built:   Jun 30 2022 11:02:23
[ec2-user@ip-10-0-10-127 httpd]$ php -v
PHP 8.0.25 (cli) (built: Oct 31 2022 22:42:34) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.25, Copyright (c) Zend Technologies

php-cliとphp-fpmの確認

まずは、それぞれの違いを確認していきます。

まずはphp-cliではありませんが、phpでバージョンを確認します。

[ec2-user@ip-10-0-10-127 /]$ php -v
PHP 8.0.25 (cli) (built: Oct 31 2022 22:42:34) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.25, Copyright (c) Zend Technologies

次にphp-fpmでバージョンを確認します。php-fpmでは、phpと同様のコマンドが使用できます。

[ec2-user@ip-10-0-10-127 /]$ php-fpm -v
PHP 8.0.25 (fpm-fcgi) (built: Oct 31 2022 22:44:30)
Copyright (c) The PHP Group
Zend Engine v4.0.25, Copyright (c) Zend Technologies

同じように見えますが、注目すべきは、それぞれ下記の1行です。

PHP 8.0.25 (cli) (built: Oct 31 2022 22:42:34) ( NTS )
PHP 8.0.25 (fpm-fcgi) (built: Oct 31 2022 22:44:30)

それぞれphpのバージョンは同じですが、括弧の中の内容が異なります。

phpの方は、cli(Command Line Interface)で実行され、php-fpmでは、fpm-fcgiで実行されていることがわかります。

php-fpmの「fpm」は、FastCgi Process Managerの略で、FastCgiという大きなくくりの中の、php-fpmという一つの種類です。ちなみにcgiはCommon Gateway Serviceの略で、Webサーバー上でプログラムを動かすための仕組みのことをいいます。

もう一つだけ、違いを確認してみます。phpinfo()で表示される中身の違いです。

まずは、phpから見てみます。

[ec2-user@ip-10-0-10-127 /]$ php -i | grep Server
Server API => Command Line Interface

次にphp-fpmです。

[ec2-user@ip-10-0-10-127 /]$ php-fpm -i | grep Server
Server API => FPM/FastCGI
Server API (SAPI) Abstraction Layer => Andi Gutmans, Shane Caraveo, Zeev Suraski

それぞれ、phpinfo()で表示される内容のうち、Serverという文字列が含まれる行のみを抽出しました。

phpでは「Command Line Interface」、つまり「cli」で、php-fpmでは「FPM/FastCGI」という表示になっています。

もう一つ、それぞれに実装されているモジュールを確認してみます。

[ec2-user@ip-10-0-10-127 /]$  php -m
[ec2-user@ip-10-0-10-127 /]$ php-fpm -m

それぞれ実行すると、表示される結果は長くなりますので、結論だけ記載すると

「pcntl」と「readline」が、phpの方にだけあり、php-fpmの方には「cgi-fcgi」という新しいモジュールがありました。

逆に前回登録したmbstringは、双方にありましたので、モジュールの追加を行っても、双方に反映されているということもわかりました。

最後に設定ファイルである「php.ini」のそれぞれの場所を確認してみます。

[ec2-user@ip-10-0-10-127 php-fpm]$ php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini
[ec2-user@ip-10-0-10-127 php-fpm]$ php-fpm -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

今度は同じ結果になりました。設定ファイルは、「/etc/php.ini」と双方同じであるということも、別々の設定が必要ないということで、安心材料です。

php-cliとは

php-cliは、Command Line Interfaceが示す通り、SSHで接続した際のコマンドラインからphpを実行する場合に使用されるプログラムです。スタンドアローンのツールのため、複数の人が同時に立ち上げても、お互いの結果などに干渉することはありません。

cliのプロセスは 1 つのコマンドに対してのみ存続し、終了するとメモリが解放されます。

MicrosoftのWordやExcelのように同じプログラムを複数起動できるイメージでしょうか。

php-fpmとは

php-fpmは、PHP5.4.0から公式にサポートされたPHP標準のアプリケーションサーバーとなります。サーバーですので、実際Webサーバーとして稼働した際に、ブラウザからのリクエストによりphpを実行するためのプログラムとなります。

php-fpmは、複数のリクエストについて、継続的にメモリを使用することで、そのメモリを再利用し、より素早くレスポンスを返すことができます。

設定ファイル

基本的な設定ファイルは、「php-cli」と「php-fpm」で共有している「php.ini」です。

php.iniの場所は下記の通りです。

[ec2-user@ip-10-0-10-127 /]$ sudo find -name 'php.ini'
./etc/php.ini

詳細については、PHP php.iniの確認と設定PHPのモジュールの確認とインストールで記載していますので、そちらを参考にしてください。

一つだけ注意しておきたいのは、上記のPHP php.iniの確認と設定では、error_logの設定をしませんでした。このエラーログは、「php-cli」と「php-fpm」の双方のエラーログとして利用されることになりますが、「php-cli」の方のエラーは、入力間違いなどあまり重要なエラーではないので、ログとして残す必要はありません。

あえてログを確認したいのであれば、下記のコマンドを入力することで確認ができます。

[ec2-user@ip-10-0-10-127 ~]$ cat /home/ec2-user/.bash_history

上記で、ec2-userのコマンドの入力履歴も見られますので、その中にphpコマンドの実行履歴も確認できるはずです。catコマンドは、viコマンドとは異なり、編集ができませんが、ファイルの内容の閲覧ができます。

php-fpmの設定ファイル

下記のコマンドでphp関連のファイルとディレクトリを確認します。

[ec2-user@ip-10-0-10-127 /]$ ll /etc | grep php
-rw-r--r--  1 root root     4024 11月  1 07:48 php-fpm.conf
drwxr-xr-x  2 root root       22 11月 11 10:19 php-fpm.d
drwxr-xr-x  2 root root     4096 11月 11 16:43 php-zts.d
drwxr-xr-x  2 root root     4096 11月 11 16:43 php.d
-rw-r--r--  1 root root    62232 11月 11 09:59 php.ini
-rw-r--r--  1 root root    62221 11月  9 10:00 php.ini.org

etcディレクトリには、多くのディレクトリとファイルがあるので、視認性が良くないため、etcディレクトリ内で、phpという名称の付くもののみに絞り込んで表示しています。

これにより3つのファイルと3つのディレクトリが確認できます。

php.iniは上述のファイルです。また、php.ini.orgはPHP php.iniの確認と設定で作成したphp.iniのバックアップ(オリジナル)ファイルです。

php.dは、PHPのモジュールの確認とインストールで確認したphpモジュールのインクルード用設定のファイルがあります。

残りは、「php-fpm.conf」ファイルと「php-fpm.d」「php-zts.d」の二つのディレクトリです。

php-zts.dディレクトリ

「php-zts.d」にあるZTSは、Zent Thread Safeの略のようで、下記で確認してみるとどちらも利用していないことが分かります。

[ec2-user@ip-10-0-10-127 etc]$ php -i | grep 'Scan this dir for additional .ini files'
Scan this dir for additional .ini files => /etc/php.d
[ec2-user@ip-10-0-10-127 etc]$ php-fpm -i | grep 'Scan this dir for additional .ini files'
Scan this dir for additional .ini files => /etc/php.d

詳細は追っていませんが、phpをインストールするとNTS(Non Thread Safe)とZTS(Zent Thread Safe)の両方の設定が自動的にインストールされるようです。今回は利用していないようなので、これ以上詳細は追及しません。

php-fpm.confファイル

「php-fpm.conf」を開いてみます。

;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;
・・・

FPM Configurationと冒頭にあります。お察しの通りphp-fpmの設定ファイルです。その直下には、下記のような記述があります。

; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
include=/etc/php-fpm.d/*.conf

この記述により上記ででた「php-fpm.d」ディレクトリ内のファイルを読み込んでいることがわかります。詳細は後に確認してみます。

さらに下にはログファイルの設定箇所があります。

; Error log file
; If it's set to "syslog", log is sent to syslogd instead of being written
; in a local file.
; Default Value: /var/log/php-fpm.log
error_log = /var/log/php-fpm/error.log

php.iniでは設定を行いませんでしたが、ここでエラーログの設定を行うことで、サーバーでphpの処理が行われた際のエラーを出力することができます。

php-fpm.dディレクトリ

ディレクトリ内を確認してみます。

[ec2-user@ip-10-0-10-127 etc]$ cd /etc/php-fpm.d
[ec2-user@ip-10-0-10-127 php-fpm.d]$ ll
合計 20
-rw-r--r-- 1 root root 19151 11月  1 07:48 www.conf

この「www.conf」という設定ファイルは、php-fpmの振る舞いを設定するファイルの様です。

現在のEc2の設定ではt2.microを設定しているので、phpの重い処理などを回すとサーバーがダウンしてしまう場合もあるかと思います。

そのときはこちらの設定を見直すことをお勧めします。

まとめ

php-fpmのディレクトリ部分については、曖昧な解説になってしまった部分もあったかと思います。ただ、これによりphpをインストールした際に依存関係としてインストールされた全てのファイルについてみることができました。

ここまで、Webサーバーについて設定、確認をしてきましたが、次回は、DBサーバーへの接続(RDS)をし、phpMyAdminのインストールを行っていこうと思います。

次回:AWS DBサーバーへの接続(RDS)とphpMyAdminの設定

一覧:AWS サーバー立ち上げ設定まとめ

文責:フライング・ハイ・ワークス代表 松田 治人(まつだ はるひと)
会社では、Laravelを中心としたエンジニアとして働いており、これまでに50本以上のLaravelによるWebアプリケーションの構築や東京でホームページ制作をしています。
エンジニアとして弊社で働きたい方、お仕事のご相談など、お待ちしております。

WEBサイト制作のお問い合わせ、お見積り依頼、ご質問は
こちらのお問い合わせフォームよりお願いいたします

メールお問い合わせはこちら

フライング・ハイ・ワークスの紹介

フライング・ハイ・ワークスは、東京のホームページ制作・Web制作会社・システム開発会社です。東京都及びその近郊(首都圏)を中心として、SEO対策を意識したPC及びスマホのサイトをワンソース(レスポンシブ対応)で制作します。

実績

デザイナーチームは、グラフィックデザインやイラストの制作も得意としており、著作権を意識しない素材の提供が可能です。システム・コーディングチームでは、Laravelなどを使用したスクラッチからのオリジナルシステム開発を始め、WordPressのカスタマイズを得意としております。

また、SEOやランディングページ(LP)、広告向けバナーなどを他社様でやっていた作業の引継ぎでも問題ありません。制作実績は多数ございますので、お客様に合わせたご提案が可能です。

500点以上のフライング・ハイ・ワークスの制作実績ページをご覧ください!

東京のホームページ制作・Web制作のお問い合わせ、お見積り依頼、相談、質問は
こちらのお問い合わせフォームよりお願いいたします

メールお問い合わせはこちら