こんにちは! 先日、あるサーバーのメンテナンスをしていて、不思議な現象に遭遇しました。
「
php -vを打っても『コマンドが見つかりません』と怒られる。なのに、なぜかWordPressは平然と動作している……」
一瞬、「え、何かがPHPの肩代わりをしてるの!?」と脳内パニックになりかけましたが、ログやパッケージリストをよく解析すると、Linuxサーバー(今回はDNFを使っているのでAlmaLinux 10やRocky Linux 10などのRHEL系環境ですね)の「ある仕組み」が原因でした。
今回は、この「一見PHPが入っていないように見えるのに、WordPressが動くカラクリ」を解説します!
謎を解く手がかり:検証ログを読み解く
送られてきたログには、重大なヒントが3つ隠されていました。
① php -v でエラーになる
# php -v
-bash: php: コマンドが見つかりません
確かに、コマンドライン(CLI)で使うための php コマンドが認識されていません。これだけ見ると「PHPがインストールされていない」ように見えます。
② dnf install php をしようとすると……
インストール:
php x86_64 8.3.29-1.el10_1 appstream 8.4 k
弱い依存関係のインストール:
php-cli x86_64 8.3.29-1.el10_1 appstream 3.6 M
ここで注目したいのは、未インストールとして挙げられているのが php 本体(わずか 8.4k のメタパッケージ)と、php-cli(3.6M) というパッケージである点です。
③ rpm -qa php* の結果(決定打!)
サーバーにインストール済みのパッケージ一覧を確認すると、答えがすべて書いてありました。
# rpm -qa php*
php-common-...
php-pdo-...
...
php-fpm-8.3.29-1.el10_1.x86_64 ←★これ!!
php-xml-...
php-mbstring-...
【結論】PHPは入っている!ただし「黒衣(裏方)」として動いている
結論から言うと、「PHPはバッチリ入っています」。 ただし、コマンドラインから実行するためのPHP(php-cli)が入っていないだけです。
WordPressが動作している理由は、リストの最後の方にある php-fpm というパッケージが原因です。
なぜ「コマンドが見つかりません」になるの?
Linux(RHEL系)のパッケージ管理において、私たちがよく使う php というコマンドは、php-cli(Command Line Interface) というパッケージに同梱されています。
今回のサーバーでは、この php-cli がインストールされていないため、システムが「php ってコマンドは知らないよ!」と返していたのです。
では、なぜWordPressは動くのか?
WordPressを動かしているのは、コマンドではなく php-fpm(FastCGI Process Manager) という「Webサーバー専用のPHP実行エンジン(デーモン)」です。
現代の高速なWordPress環境(Nginx + PHP-FPM や Apache + mpm_event + PHP-FPM)では、Webサーバー(Nginx等)がブラウザからのリクエストを受け取り、裏側で待機している php-fpm に「このPHPファイルを処理して!」と直接丸投げします。
この連携に php-cli(phpコマンド)は一切必要ありません。そのため、コマンドが未実装でもWordPressは何の問題もなく、爆速で動作し続けていたのです。
なぜこんな状態のサーバーが生まれるのか?
「普通は dnf install php で一括インストールするんじゃないの?」と思いますよね。 この状態が生まれる主な理由は以下の2つです。
-
セキュリティと軽量化のため(プロの設定) 本番環境のサーバーでは、「不要なものは入れない」のが鉄則です。コマンドラインからPHPを動かす必要がない(CronなどでPHPを実行しない)環境であれば、脆弱性リスクを減らし、サーバー容量を節約するために
php-fpm周りだけをピンポイントでインストールすることがあります。 -
構築スクリプト(AnsibleやDockerなど)の指定漏れ サーバーを自動構築する際、Webサイトを動かすためだけに
php-fpmなどを指定し、php-cliを入れ忘れた(あるいは不要と判断した)ケースです。
まとめ:php -v が使えなくて不便なときの対処法
もし、この状態のサーバーで「WP-CLIを使いたい」「CronでPHPスクリプトを動かしたい」となった場合は、大人しく以下のコマンドを実行しましょう。
# dnf install php-cli
これで無事に php -v が使えるようになります!
「コマンドがない=システムが入っていない」とは限らないのが、Linuxサーバー管理の奥深く、そして面白いところですね。同じ現象で首をかしげていた方の参考になれば幸いです!
