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サイト制作のお問い合わせ、お見積り依頼、ご質問は
こちらのお問い合わせフォームよりお願いいたします

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

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

フライング・ハイ・ワークスは、東京都渋谷区にある2000年3月創業のシステム開発にも対応できるデザインも強いWeb制作・ホームページ制作会社です。東京都及びその近郊(首都圏)を中心として、SEO対策を意識したPC及びスマホのサイトをワンソース(レスポンシブ対応)で制作します。

実績

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

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

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

採用

FHWでWebディレクター、Webデザイナー、Webプログラマーやシステム開発者として働いてみたいと思っていただける方は、下記にて定期的に募集をしておりますので、ぜひ、ご応募ください。

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

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