他の SAPI との違い
CLI SAPI を他の SAPI と比べた時の 大きな違いを以下に示します。
-
CGI SAPI と異なり、ヘッダが出力されません。
CGI SAPI は HTTP ヘッダの出力を抑制する機能を 提供していますが、等価な機能は CLI SAPI ではサポートされていません。
デフォルトでは CLI は静寂モードで起動されます。古い CGI スクリプトと互換性を 保って使えるように -q および --no-header スイッチが残されています。
作業ディレクトリをスクリプトの場所に変更しません (-C および --no-chdir スイッチは 互換性のために残されています)。
エラーメッセージはプレーンテキスト (HTML フォーマットはしない) で表示されます。
-
以下に示すいくつかの php.ini ディレクティブは、CLI SAPI により上書きされます。これは、シェル環境では意味がないためです。
上書きされる php.ini のディレクティブ ディレクティブ CLI SAPI のデフォルト値 コメント html_errors false
エラーメッセージに含まれる HTML タグは シェル上では意味がなく、可読性をかなり低下させるため、この ディレクティブはデフォルトで false
となっています。implicit_flush true
print, echo および 関連するものによる全ての出力は、直ちに出力され、バッファに キャッシュされないことが望ましいと言えます。この場合でも、 標準出力を保留または操作したい場合には、 出力バッファリング を使用することが可能です。 max_execution_time 0 (無制限) シェル環境では、PHP を際限なく使用できる ようにするために、最大実行時間の制限は無しに設定されています。 Web 用アプリケーションは数秒単位で実行されるよう作られて いますが、シェルアプリケーションの実行時間は、これよりかなり 長くなる傾向があります。 register_argc_argv true
この設定が
true
なので、CLI SAPI では常に argc (アプリケーションに渡した引数の数) および argv (実際の引数の配列) を使うことができます。CLI SAPI を使用するときに PHP の $argc 変数と $argv 変数が登録され、適切な値がセットされます。 あるいは $_SERVER や $_SERVER['argv'] を使うこともできます。
output_buffering false
max_input_time false
PHP CLI は GET、POST あるいはファイルのアップロードをサポートしません。
注意:
これらのディレクティブは、設定ファイル php.ini またはカスタム 設定ファイル(指定した場合のみ)で他の値に初期化できません。 この制限は、これらのデフォルト値が全ての設定ファイルをパースした後に 適用されるためです。しかし、これらの値は実行時に変更することが 可能です (上記のディレクティブの全てについてこれが当てはまるわけでは ありません。例えば、register_argc_argv)。
注意:
コマンドラインのスクリプトでは ignore_user_abort を設定することを推奨します。詳細は ignore_user_abort() を参照ください。
-
シェル環境での利便性を考慮して、 I/O ストリーム 用に多くの定数が定義されています。
-
CLI SAPI は、カレントディレクトリをスクリプトのディレクトリに変更 しません!
例1 CGI SAPI との違いを示す例
<?php
// test.php という名前のシンプルなテストアプリケーション
echo getcwd(), "\n";
?>CGI 版を使った場合、出力は以下のようになります。
$ pwd /tmp $ php -q another_directory/test.php /tmp/another_directory
これは、PHP がカレントディレクトリを スクリプトのディレクトリに変更することを明らかに示しています。
CLI SAPI を使った場合はこのようになります。
$ pwd /tmp $ php -f another_directory/test.php /tmp
これにより、PHP でシェルツールを書く際の柔軟性をより大きくすることができます。
注意:
CGI SAPI は、この CLI SAPI の動作をコマンドライン実行時のスイッチ
-C
によりサポートしています。