cloudfreeサーバ内のPHPで、CGI版とCLI版の差を調べてみる
2023-12-20 記載
概要 : PHPのCGI版とCLI版の使い分け方
Keyword : PHP, cron, CGI, CLI, phpinfo,
サーバーパネル→サーバー情報→コマンドパス一覧
をみますと
PHPの実行パスは各バージョンにおいて CGI版とCLI版が記載されています。
これはどういうことでしょうか。
まずCGI版とCLI版の違いをChatGPTに尋ねてみましょう。
CGI版(Common Gateway Interface)は、ウェブサーバーとのインタラクションを可能にするために設計されています。ウェブサーバーからのリクエストに対してPHPスクリプトを実行し、結果を生成して返します。
ChatGPT
一方、CLI版(Command Line Interface)は、コマンドライン上で直接PHPスクリプトを実行するためのものです。ウェブサーバーを介さずに、コマンドラインからPHPスクリプトを実行できます。
そのため、CGI版は主にウェブサーバー上で動作し、ウェブページの生成や処理に使用されます。一方、CLI版はコマンドラインでのスクリプト実行や、バッチ処理、システム管理など幅広い用途で利用されます。
といういことは、CGI版はWindowsではApacheのhttpd.confに記載した
LoadModule php_module “c:/pgm/php8/php8apache2_4.dll”
に実行させているようなものですね。最終的にはどちらも元請け実行exeファイルはphp.exeになるのだと思いますが。
以前私がcronであれこれテストしたところ、
$_SERVER[‘DOCUMENT_ROOT’]
が空だったのでincludeでエラーになりしました。
CGI版なら環境変数がWebから呼ばれた状態を想定してセットされているのかも、と期待して、CGI版とCLI版のそれぞれでphpinfoを取得して比べてみました。
(ありがたいことにphpinfoが取れるのです。嬉 )
// バッファリング開始
ob_start();
// phpinfo出力
phpinfo();
// バッファ内容を変数に保存
$phpinfo_output = ob_get_contents();
// バッファリング終了
ob_end_clean();
// ファイルにバッファ内容(=phpinfo()の出力)を書き込み
file_put_contents('phpinfo_cgi82.txt', $phpinfo_output);
HTMLテーブル形式で見やすくを出力してくれてる、と思っていたら違いました。どこで判定しているのか?見づらいテキスト形式でしたが、WinMergeでCGI版とCLI版のdiffを調べたら、読み解くまでもなく両者に違いはありませんでした。
(phpinfoの内容はサーバー攻撃資料とされるので、内容掲示は控えます)
『それならなぜ2種あげてあるのですか?』と疑問はつながるのですが、それはあれこれやっててもし判明すればお伝えしようと思います。