2022.11.16 Web制作
システム開発 - 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の設定
文責:フライング・ハイ・ワークス代表 松田 治人(まつだ はるひと)
会社では、Laravelを中心としたエンジニアとして働いており、これまでに50本以上のLaravelによるWebアプリケーションの構築や東京でホームページ制作をしています。
エンジニアとして弊社で働きたい方、お仕事のご相談など、お待ちしております。
WEBサイト制作のお問い合わせ、お見積り依頼、ご質問は
こちらのお問い合わせフォームよりお願いいたします
フライング・ハイ・ワークスの紹介
フライング・ハイ・ワークスは、東京のホームページ制作・Web制作会社・システム開発会社です。東京都及びその近郊(首都圏)を中心として、SEO対策を意識したPC及びスマホのサイトをワンソース(レスポンシブ対応)で制作します。
実績
デザイナーチームは、グラフィックデザインやイラストの制作も得意としており、著作権を意識しない素材の提供が可能です。システム・コーディングチームでは、Laravelなどを使用したスクラッチからのオリジナルシステム開発を始め、WordPressのカスタマイズを得意としております。
また、SEOやランディングページ(LP)、広告向けバナーなどを他社様でやっていた作業の引継ぎでも問題ありません。制作実績は多数ございますので、お客様に合わせたご提案が可能です。
500点以上のフライング・ハイ・ワークスの制作実績ページをご覧ください!
東京のホームページ制作・Web制作のお問い合わせ、お見積り依頼、相談、質問は
こちらのお問い合わせフォームよりお願いいたします