PHP をコマンドラインから使用する
コマンドラインの使用法
はじめに
&cli.sapi; の主な目的は、シェルアプリケーションを PHP
で開発することです。&cli.sapi; とその他の
SAPI の間にはちょっとした違いがあり、
それを本章で説明します。&cli; と CGI
は多くの共通点がありますが、別の SAPI
であるということも覚えておきましょう。
&cli.sapi; は、
--enable-cli でデフォルトで有効となっています。
./configure の際に
--disable-cli オプションを指定して無効にすることもできます。
&cli;/CGI バイナリの名前、位置、そして存在するかどうかは
PHP がどのようにインストールされているかによって異なります。デフォルトで
make を実行したときには、CGI と
&cli; が両方ビルドされて、それぞれ PHP ソースディレクトリの sapi/cgi/php-cgi と
sapi/cli/php にできあがります。
両方とも php という名前であることに注意しましょう。
make install のときにどうなるかは、configure
行に依存します。
configure で例えば apxs のような SAPI モジュールが選択された場合、または
--disable-cgi が指定された場合、
make install によって &cli; が {PREFIX}/bin/php
にコピーされます。さもなければ CGI がそこにコピーされます。
つまり、たとえば configure で --with-apxs
を指定すると、make install での &cli; のコピー先は
{PREFIX}/bin/php となります。
既にインストールされている CGI バイナリを上書きしたい場合には、
make install の後に make install-cli
を実行してください。あるいは configure で
--disable-cgi を指定することもできます。
--enable-cli
と --enable-cgi
の両方がデフォルトで有効になっています。そのため、configure で
--enable-cli
を指定したからといって、make install で
{PREFIX}/bin/php
にコピーされるのが必ずしも &cli; になるとは限りません。
Windows 版の &cli; はメインフォルダ内で php.exe
という名前で配布されます。CGI バージョンは、php-cgi.exe
として配布されます。さらに
configure で --enable-cli-win32
を指定すると、新しく php-win.exe というファイルが配布されます。
これは &cli; バージョンとほぼ同じですが、何も出力しないため、コンソールは必要ありません。
自分の SAPI は何か?
シェルで php -v をタイプすると、
php が CGI なのか &cli; なのかわかります。
php_sapi_name と定数 PHP_SAPI
も参照ください。
Unix の man ページは、
シェル環境から man php とすれば見ることができます。
他の 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'] を使うこともできます。
$argv や $_SERVER['argv']
が存在することは、PHPスクリプトがコマンドラインから実行されていることを示す信頼できる根拠にはなりません。
なぜなら、 register_argc_argv
が有効になっている場合に、他のコンテキストで設定されている可能性があるからです。
コマンドラインから実行されていることを確認するには、代わりに php_sapi_name の返り値をチェックすべきです。
output_buffering
&false;
&php.ini; で &false; とハードコードされていても、
出力バッファリング
関数は使用可能です。
max_input_time
&false;
PHP &cli; は GET、POST あるいはファイルのアップロードをサポートしません。
これらのディレクティブは、設定ファイル &php.ini; またはカスタム
設定ファイル(指定した場合のみ)で他の値に初期化できません。
この制限は、これらのデフォルト値が全ての設定ファイルをパースした後に
適用されるためです。しかし、これらの値は実行時に変更することが
可能です
(上記のディレクティブの全てについてこれが当てはまるわけでは
ありません。例えば、 register_argc_argv)。
コマンドラインのスクリプトでは
ignore_user_abort
を設定することを推奨します。詳細は ignore_user_abort
を参照ください。
シェル環境での利便性を考慮して、
I/O ストリーム
用に多くの定数が定義されています。
&cli.sapi; は、カレントディレクトリをスクリプトのディレクトリに変更
しません !
CGI SAPI との違いを示す例
]]>
CGI 版を使った場合、出力は以下のようになります。
これは、PHP がカレントディレクトリを
スクリプトのディレクトリに変更することを明らかに示しています。
&cli.sapi; を使った場合はこのようになります。
これにより、PHP でシェルツールを書く際の柔軟性をより大きくすることができます。
CGI SAPI は、この &cli.sapi;
の動作をコマンドライン実行時のスイッチ -C
によりサポートしています。
コマンドラインオプション
オプション
PHP バイナリにより提供されるコマンドラインオプションの一覧は、
-h スイッチを指定して PHP を実行することにより
いつでも調べることができます。
[--] [args...]
php [options] -r [--] [args...]
php [options] [-B ] -R [-E ] [--] [args...]
php [options] [-B ] -F [-E ] [--] [args...]
php [options] -- [args...]
php [options] -a
-a Run interactively
-c | Look for php.ini file in this directory
-n No php.ini file will be used
-d foo[=bar] Define INI entry foo with value 'bar'
-e Generate extended information for debugger/profiler
-f Parse and execute .
-h This help
-i PHP information
-l Syntax check only (lint)
-m Show compiled in modules
-r Run PHP without using script tags ..?>
-B Run PHP before processing input lines
-R Run PHP for every input line
-F Parse and execute for every input line
-E Run PHP after processing all input lines
-H Hide any passed arguments from external tools.
-S : Run with built-in web server.
-t Specify document root for built-in web server.
-s Output HTML syntax highlighted source.
-v Version number
-w Output source with stripped comments and whitespace.
-z Load Zend extension .
args... Arguments passed to script. Use -- args when first argument
starts with - or script is read from stdin
--ini Show configuration file names
--rf Show information about function .
--rc Show information about class .
--re Show information about extension .
--rz Show information about Zend extension .
--ri Show configuration for extension .
]]>
コマンドラインオプション
オプション
長い形式のオプション
説明
-a
--interactive
PHP を対話的に実行します。詳細な情報は、 対話シェル
を参照ください。
-b
--bindpath
外部 FASTCGI サーバーモードでのバインドパス (CGI
のみ)。
-C
--no-chdir
スクリプトのディレクトリへ chdir しません (CGI のみ)。
-q
--no-header
静寂モード。HTTP ヘッダの出力を抑制します
(CGI のみ)。
-T
--timing
スクリプトを count 回繰り返して実行した時間を計測します
(CGI のみ)。
-c
--php-ini
このオプションを使用することにより、&php.ini; を探すディレクトリを
指定したり、カスタマイズされた INI ファイル
(&php.ini; という名前である必要はありません)を直接指定する
ことが可能です。例:
このオプションを指定しない場合、ファイルは、
デフォルトの位置
で探索されます。
-n
--no-php-ini
&php.ini; を完全に無視します。
-d
--define
このオプションにより &php.ini; で指定できる設定ディレクティブに
カスタム値を設定することができます。構文は以下のようになります。
INI 設定に -d を使って値を設定する例
-e
--profile-info
デバッガ/プロファイラ用の拡張情報を出力します。
-f
--file
-f オプションに指定したファイル名をパースし、
実行します。このスイッチはオプションで省略することもできます。
実行するスクリプトを指定するだけで充分です。
-h and -?
--help and --usage
このオプションを使用すると、実際の一連のコマンドラインオプションと
各1行の説明が情報を取得できます。
-i
--info
このコマンドラインオプションは、phpinfo をコールし、
結果を出力します。PHP が正しく動作していない場合、
php -i を実行し、情報テーブルの前または中に
出力されるエラーメッセージを調べることをお勧めします。
CGI モードの場合、
出力が HTML 形式で行なわれるため
量がかなり多くなることに注意してください。
-l
--syntax-check
構文チェックを行いますが、指定された PHP コードは実行しません。
ファイル名が指定されない場合、標準出力の入力をチェックしますが、
指定された場合、それぞれのファイルがチェックされます。
成功した場合、
テキスト
No syntax errors detected in <filename>
が標準出力に書き込まれ、リターンコードは 0
になります。失敗した場合は
テキスト Errors parsing
<filename> に加え、内部パーサーエラーメッセージ
が標準出力に書き込まれ、シェルリターンコードは、
-1 となります。
このオプションは、(未定義の関数のような)致命的なエラー(fatal error)
を見つけることはありません。そうするためには、
コード全体を実行する必要があるからです。
PHP 8.3.0 より前のバージョンでは、
構文チェックできるファイルの数は一つだけでした。
このオプションは、オプション -r と共に使用することは
できません。
-m
--modules
PHP に組み込まれた (そしてロードされた) Zend モジュールの表示
-r
--run
このオプションにより、コマンドラインのみで PHP
の実行ができるようになります。
PHP の開始および終了タグ
(<?php および ?> )
は不要 で、これらを付けると
パーサーエラーとなります。
このように PHP を実行する際に、コマンドラインの
変数がシェルにより行なわれる置換と干渉しないように注意してください。
ダブルクォートの使用時に構文エラーが出る例
ここでの問題は、2 重引用符 " を用いた場合でも
sh/bash が変数置換を行うことです。
$foo はおそらく定義されていないので、
空文字列に展開された後、実行用に PHP に
そのコードが渡され、以下のように読み込むことになります。
正しい方法は、1 重引用符' を使用することです。
1 重引用符で括られた文字列の中の変数は、sh/bash により展開されません。
シングルクォートを使い、シェルの変数置換を防ぐ例
int(1)
["E_WARNING"]=>
int(2)
["E_PARSE"]=>
int(4)
["E_NOTICE"]=>
int(8)
["E_CORE_ERROR"]=>
[...]
]]>
sh/bash 以外のシェルを使用している場合には、別の問題を経験したことが
あるかもしれません。バグを
&url.php.bugs;
に報告してください。
シェル変数をコードに取得しようとしたり、エスケープを行なうために
バックスラッシュを使用したりした場合にも、容易に問題を発生する
可能性があります。注意が必要です。
-r は &cli.sapi; で有効で、
CGI SAPI では使用できません。
このオプションはあくまで基本的な機能を提供するものです。そのため、
いくつかの設定ディレクティブ(例: auto_prepend_file および auto_append_file)は
このモードでは無視されます。
-B
--process-begin
標準入力を処理する前に実行する PHP コードを指定します。
-R
--process-code
それぞれの入力行に対して実行する PHP コードを指定します。
このモードには 2 つの特別な変数
$argn と $argi
が用意されています。
$argn は PHP がその瞬間に処理している行を含み、
$argi はその行番号を含んでいます。
-F
--process-file
全ての入力行に対して実行する PHP ファイルを指定します。
-E
--process-end
入力を処理した後に実行する PHP コードを指定します。
とあるプロジェクトの行数をカウントするための
-B , -R そして -E
オプションの使用例
-S
--server
ビルトインウェブサーバー
を開始させます。
-t
--docroot
ビルトインウェブサーバー
のドキュメントルートを指定します。
-s
--syntax-highlight と --syntax-highlighting
カラー構文ハイライト表示されたソースを表示します。
このオプションは、ファイルをパースし、HTML
ハイライト表示版のファイルを生成し、標準出力に書き出す内部機
構を使用します。行うのは
<code> [...] </code> のブロックを
生成することだけで、HTML ヘッダは
出力されないことに注意してください。
このオプションは、-r オプションと同時に
使用することはできません。
-v
--version
-v による、SAPI
名および PHP と Zend のバージョンの取得
-w
--strip
コメントと空白文字を削除してソースを表示します。
このオプションは、-r オプションと同時に
使用することはできません。
-z
--zend-extension
Zend 拡張モジュールをロードします。ファイル名のみが指定された場合、
PHP はこの拡張をカレントのシステムのデフォルトライブラリパスから
ロードしようとします
(Linux システムの場合は /etc/ld.so.conf で
指定されています)。
ファイル名を絶対パスで指定した場合、システムのライブラリサーチパスを
使用しません。ディレクトリ情報を有する相対ファイル名を
指定すると、PHP は
カレントのディレクトリの相対パスから拡張モジュールをロードする
ことのみを行ないます。
--ini
設定ファイルの名前、設定ファイルを検索するディレクトリを表示します。
--ini の例
--rf
--rfunction
指定した関数あるいはクラスメソッドについての情報
(たとえばパラメータの数と名前など) を表示します。
このオプションは、PHP が
リフレクション
のサポートつきでコンパイルされている場合にのみ使用可能です。
基本的な --rf の使用法
public function var_dump ] {
- Parameters [2] {
Parameter #0 [ $var ]
Parameter #1 [ $... ]
}
}
]]>
--rc
--rclass
指定したクラスについての情報 (定数、プロパティおよびメソッドの一覧)
を表示します。
このオプションは、PHP が
リフレクション
のサポートつきでコンパイルされている場合にのみ使用可能です。
--rc の例
class Directory ] {
- Constants [0] {
}
- Static properties [0] {
}
- Static methods [0] {
}
- Properties [0] {
}
- Methods [3] {
Method [ public method close ] {
}
Method [ public method rewind ] {
}
Method [ public method read ] {
}
}
}
]]>
--re
--rextension
指定した拡張モジュールについての情報 (&php.ini; オプション、
定義されている関数、定数およびクラスの一覧) を表示します。
このオプションは、PHP が
リフレクション
のサポートつきでコンパイルされている場合にのみ使用可能です。
--re の例
extension #19 json version 1.2.1 ] {
- Functions {
Function [ function json_encode ] {
}
Function [ function json_decode ] {
}
}
}
]]>
--rz
--rzendextension
指定した Zend 拡張モジュールについての情報
(phpinfo が返す情報と同じもの)
を表示します。
--ri
--rextinfo
指定した拡張モジュールについての設定情報 (phpinfo
が返す情報と同じもの) を表示します。
コア機能に関する設定情報は、
"main" というモジュール名で取得できます。
--ri の例
enabled
"Olson" Timezone Database Version => 2009.20
Timezone Database => internal
Default timezone => Europe/Oslo
Directive => Local Value => Master Value
date.timezone => Europe/Oslo => Europe/Oslo
date.default_latitude => 59.930972 => 59.930972
date.default_longitude => 10.776699 => 10.776699
date.sunset_zenith => 90.583333 => 90.583333
date.sunrise_zenith => 90.583333 => 90.583333
]]>
オプション -rBRFEH 、--ini および
--r[fcezi] は &cli; でのみ使用可能です。
PHP ファイルの実行
PHP ファイルの実行
&cli.sapi; は、実行する PHP コードを
取得するために三種類の異なる手段をサポートしています。
PHP に特定のファイルの実行を指示する。
上記の方法は共に(-f スイッチの使用の如何に関らず)
指定したファイル my_script.php を実行します。
実行ファイルとしてあらゆるファイルを指定することができ、
PHP スクリプトは拡張子
.php で終わる必要がなく、任意の名前や拡張子を
使用することができます。
実行する PHP コードをコマンドラインで直接指定する。
シェル変数の置換と引用符の使用については特に注意してください。
この例をよくみてください。開始/終了タグがありません!
-r スイッチを使用した場合、これらのタグは不要と
なります。これらのタグを使用するとパーサーエラーを発生します。
実行する PHP コードを標準入力
(stdin )で指定する。
これは強力な機能で、以下の(仮想的な)例に示すように、動的に
PHP コードを生成し、実行バイナリに入力すること
ができます。
final_output.txt
]]>
これらのコードを実行する三種類の方法を組み合わせて使用することはできません。
他のシェルアプリケーションのように、PHP バイナリに
引数を指定することができるだけでなく、PHP スクリプトが
この引数を取得することも可能です。スクリプトに指定できる
引数の数は PHP による制限を受けません
(シェルは指定可能な文字数の最大値を設定しています。通常、この制限値を
越えることはできません)。スクリプトに指定した引数は、グローバル配列
$argv でアクセス可能です。
最初のインデックス (添字 0) には常に、
コマンドラインからコールしたスクリプト名が含まれています。
コマンドラインスイッチ
-r を使ってインラインでコードを実行した場合は、
$argv[0] の値は "Standard input code"
となることに注意しましょう。
PHP 7.2.0 より前のバージョンでは、
ダッシュ (- ) でした。
STDIN
の内容をパイプ経由で実行した場合も同じです。
登録される第 2 のグローバル変数は $argc で
(スクリプトに指定された引数の数ではなく
)、配列 $argv の要素数が含まれます。
スクリプトに指定する引数が文字 - で始まっていない
限り、特に留意すべきことはありません。スクリプトに指定する引数が文字
- で始まる場合、PHP 自体がこれを
パースする必要があるとみなすため、問題を発生します。
これを防止するため、引数リストセパレータ -- を
使用してください。PHP にパースされる引数の後に
このセパレータを置くと、その後の全ての引数はそのままパースされずに
スクリプトに渡されます。
[args...]
[...]
# これは '-h' を引数として解釈し、PHP の使用法を表示しません
$ php -r 'var_dump($argv);' -- -h
array(2) {
[0]=>
string(1) "-"
[1]=>
string(2) "-h"
}
]]>
Unix システムでは、PHP をシェルスクリプトとして使用する他の手段があります。
最初の行が #!/usr/bin/php
(必要に応じて、PHP &cli; バイナリのパスを置き換えてください)
で始まり、PHP の開始/終了タグの中に通常の
PHP コードが続くスクリプトを書き、適当なファイル
実行属性を設定する(例: chmod +x test )ことが可能です。
この方法は、通常のシェル/Perl スクリプトと同様に実行することができます。
シェルスクリプトとしての PHP スクリプトの実行
]]>
このファイルの名前が test で、カレントディレクトリに
あるとすると、以下のように実行することができます。
string(6) "./test"
[1]=>
string(2) "-h"
[2]=>
string(2) "--"
[3]=>
string(3) "foo"
}
]]>
見て分かるように、- で始まるスクリプトのパラメータを
指定する際に、特に注意する必要はありません。
PHP 実行バイナリは、Web サーバーから完全に独立して PHP スクリプトを
実行するために使用することができます。Unix システムを使用している場合、
実行可能とするためには PHP スクリプトの先頭に特別な一行を追加する必要が
あります。これにより、システムがそのスクリプトを実行するプログラムを
知ることができます。
Windows 環境では、.php ファイルのダブルクリック
オプションに php.exe を関連づけることができます。
または、PHP によりスクリプトを実行するバッチファイルを作成することも
可能です。Unix 上で動作させるためにスクリプトに追加された先頭行は、
Windows 環境での動作に悪影響を与えません。このため、この手法により、
クロスプラットフォーム環境で動作するプログラムを書くことができます。
コマンドライン PHP プログラムの書方の簡単な例を以下に示します。
コマンドラインから実行されることを意図したスクリプト(script.php)
これは、ひとつのオプションをとるコマンドラインの PHP スクリプトです。
使用法:
は出力したい単語です。
--help, -help, -h, あるいは -? を指定すると、
このヘルプが表示されます。
]]>
上のスクリプトでは、特殊な先頭行が用いられており、このファイルが
PHP により実行されることを示しています。ここでは &cli; 版を使用しているため、
HTTP ヘッダは出力されません。PHP で
コマンドラインアプリケーションを使用する際には、2 つの変数
$argc および $argv を使用することが
できます。
最初の変数は、引数の数に 1 (実行中のスクリプトの名前)を加えたものです。
2 番目の変数は、引数を保持する配列で、スクリプト名を有する
要素 0 ($argv[0] ) から始まっています。
上のプログラムでは、引数が 1 より少ないかまたは多いかを調べています。
また、引数が --help , -help ,
-h または -? の場合、
ヘルプメッセージを出力し、動的にスクリプト名を出力します。
他の引数を受け取った場合、これを出力します。
上のスクリプトを Unix で実行する場合、実行可能とした後、
script.php echothis または
script.php -h とする必要があります。
Windows では、この処理を行なう以下のようなバッチファイルを作成することができます。
コマンドライン PHP スクリプトを実行するバッチファイル(script.bat)
上のプログラムが script.php という名前であるとし、
c:\php\php.exe に &cli; php.exe
があるとすると、このバッチファイルは、追加オプション
script.bat echothis または
script.bat -h
を指定して、スクリプトを実行します。
PHP のコマンドラインアプリケーションを拡張するために使用できるその他の関数については、
拡張モジュール
Readline に関するドキュメントも参照ください。
Windows 環境で使用している場合、PHP の設定によって
C:\php\php.exe や拡張子 .php
の指定を不要にすることもできます。 Micosoft
Windows コマンドラインでの PHP を参照ください。
Windows では、実際に存在するユーザーアカウントの権限で PHP を実行することを推奨します。
"アカウント名とセキュリティID の間のマッピングは実行されませんでした。" というエラーのため、
ネットワークサービス経由で実行する特定の操作は失敗する場合があります
入出力ストリーム
I/O ストリーム
&cli.sapi; には入出力ストリーム用の定数がいくつか定義されており、
これらを使うとコマンドライン用のプログラミングが多少簡単になります。
CLI 固有の定数
定数
説明
STDIN
stdin へのオープン済みのストリーム。
これにより、以下のようにオープンする必要がなくなります。
]]>
stdin から1行読み込みたい場合、以下のようにします。
]]>
STDOUT
stdout へのオープン済みのストリーム。
これにより、以下のようにオープンする必要がなくなります。
]]>
STDERR
stderr へのオープン済みのストリーム。
これにより、以下のようにオープンする必要がなくなります。
]]>
上記のように、stderr のようなストリームを自分で
オープンする必要はなく、以下のようにストリームリソースの代わりに
定数を使用するだけでかまいません。
これらのストリームを明示的に閉じる必要はありません。これは、
PHP により自動的に行われます。
これらの定数は、PHP スクリプトを
stdin から読み込んだ場合は使用できません。
対話シェル
--with-readline オプションつきで
PHP をコンパイルした場合に &cli.sapi; で対話シェルが使えるようになりました。
対話シェルは、-a オプションで使うことができます。
PHP 7.1.0 以降では、 readline 拡張モジュール が有効であれば
対話シェルは Windows 上でも使用可能です。
対話シェルを使うと、PHP のコードを打ち込んで直接実行できるようになります。
対話シェル上でのコードの実行
echo 5+8;
13
php > function addTwo($n)
php > {
php { return $n + 2;
php { }
php > var_dump(addtwo(2));
int(4)
php >
]]>
対話シェル上では、タブ補完機能を使って
関数や定数、クラス名、変数名、static メソッドの呼び出し、
そしてクラス定数を補完することができます。
タブ補完
補完候補が複数あるときにタブキーを二度押すと、
補完候補の一覧が表示されます。
strp[TAB][TAB]
strpbrk strpos strptime
php > strp
]]>
候補がひとつしかないときは、タブキーを一度押せば残りを補完してくれます。
strpt[TAB]ime(
]]>
対話シェルのセッション上で定義したものについても補完することができます。
$fooThisIsAReallyLongVariableName = 42;
php > $foo[TAB]ThisIsAReallyLongVariableName
]]>
対話シェル上では操作履歴が保存され、上矢印キーと下矢印キーで履歴にアクセスすることができます。
履歴の保存先は ~/.php_history ファイルです。
PHP 8.4.0 以降では、環境変数 PHP_HISTFILE を使って
履歴ファイルのパスを設定できます。
&cli.sapi; では、二つの
&php.ini; 設定が使えます。cli.pager と
cli.prompt です。cli.pager
は、外部のプログラム (less など)
を出力のページャとして指定することができます。
出力が画面に直接送られるかわりに、このページャに送られるようになります。
cli.prompt を指定すると、
php > プロンプトを変更することができます。
また、対話シェルの中では、
&php.ini; 項目を設定する際に短縮記法が使えます。
対話シェル内での &php.ini; の設定
cli.prompt を設定します。
#cli.prompt=hello world :>
hello world :>
]]>
バッククォートを使うと、PHP のコードの実行結果をプロンプトとして用いることができます。
#cli.prompt=`echo date('H:i:s');` php >
15:49:35 php > echo 'hi';
hi
15:49:43 php > sleep(2);
15:49:45 php >
]]>
ページャを less に設定します。
#cli.pager=less
php > phpinfo();
(出力が less に送られます)
php >
]]>
cli.prompt の設定は、次のようなエスケープシーケンスに対応しています。
cli.prompt のエスケープシーケンス
シーケンス
説明
\e
プロンプトに色をつけます。たとえば
\e[032m\v \e[031m\b \e[34m\> \e[0m
のように使います。
\v
PHP のバージョン。
\b
PHP が今どのブロックにいるのかを示します。たとえば、
複数行コメントの中にいる場合は /* となります。
外側のスコープは php で表します。
\>
プロンプト文字を示します。デフォルトでは
> ですが、ブロックや文字列の途中にあるときは変わります。
' " {
( > のような文字になることがあります。
auto_prepend_file および auto_append_file で
インクルードされたファイルはこのモードでもパースされますが、
いくつかの制限があります。例えば、関数はそれがコールされる前に
定義されていなければなりません。
インタラクティブモード
PHP 8.1.0 より前のバージョンでは、readline 拡張モジュールが利用できない場合に、
&cli.sapi; を -a
オプション付きで呼び出すとインタラクティブモードになっていました。
このモードでは、
完全な PHP スクリプトを標準入力(STDIN)から与えなければいけません。
スクリプトを入力後、
CTRL
D
(POSIXの場合) や
CTRL
Z
の後に ENTER (Windows)
を続けると、その PHP スクリプトが評価されていました。
&cli.sapi; を -a
なしで呼び出しても基本的に同じ動きをします。
PHP 8.1.0 以降では、
readline 拡張モジュールが利用できない場合、
&cli.sapi; に -a
オプションを付けた呼び出しは失敗します。
ビルトインウェブサーバー
このウェブサーバーは、アプリケーション開発の支援用として設計されたものです。
テスト用に使ったり、制約のある環境でアプリケーションをデモするために使ったりすることもできるでしょう。
あらゆる機能を兼ね備えたウェブサーバーを目指したものではないので、
公開ネットワーク上で使ってはいけません。
&cli.sapi; にはウェブサーバーの機能が組み込まれています。
このウェブサーバーは単一のシングルスレッドプロセスしか実行しないので、
リクエストがブロックされると、PHP アプリケーションはストールします。
URI リクエストの処理は、PHP を開始した時点の作業ディレクトリから行われます。
-t オプションを使えば、ドキュメントルートを明示的に指定することができます。
URI リクエストにファイルが含まれない場合は、指定したディレクトリにある index.php
あるいは index.html を返します。どちらも存在しない場合は、
親ディレクトリにさかのぼって index.php と index.html を探します。
どちらか一方が見つかるか、あるいはドキュメントルートに達するまでこれが続きます。
index.php あるいは index.html が見つかるとそれを返し、
$_SERVER['PATH_INFO'] が URI の末尾にセットされます。
見つからなかった場合はレスポンスコード 404 を返します。
ウェブサーバーの開始時にコマンドラインで PHP ファイルを指定すると、
そのファイルをウェブサーバーの "ルーター" スクリプトとして使います。
このスクリプトは、各 HTTP リクエストの開始時に動きます。このスクリプトが
&false; を返すと、リクエストされたリソースをそのままの形式で返します。
それ以外の場合はスクリプトの出力をブラウザに返します。
以下にあげる拡張子のファイルについては、標準の MIME タイプを返します:
.3gp
.apk
.avi
.bmp
.css
.csv
.doc
.docx
.flac
.gif
.gz
.gzip
.htm
.html
.ics
.jpe
.jpeg
.jpg
.js
.kml
.kmz
.m4a
.mov
.mp3
.mp4
.mpeg
.mpg
.odp
.ods
.odt
.oga
.ogg
.ogv
.pdf
.png
.pps
.pptx
.qt
.svg
.swf
.tar
.text
.tif
.txt
.wav
.webm
.wmv
.xls
.xlsx
.xml
.xsl
.xsd
.zip
PHP 7.4.0 以降では、ビルトインウェブサーバーに対して複数のリクエストを並列で投げる必要があるテストコードのために、
複数のワーカーをフォークさせるよう設定できるようになりました。
サーバーを起動する前に欲しいワーカーの数を PHP_CLI_SERVER_WORKERS 環境変数に設定してください。
この機能は Windows ではサポートされていません。
PHP のコマンドラインの使い方やオプションについては、
php --help または man php を実行してください。
すべてのオプションがウェブサーバーの実行時に適用されるわけではありません。
この機能は 実験的なもの であり、
本番環境で使うことを意図した機能では ありません 。
ビルトインウェブサーバーは本番環境で使うものではありません 。
ウェブサーバーの起動
ターミナルには次のように表示されます。
http://localhost:8000/ と
http://localhost:8000/myscript.html をリクエストした後のターミナルの表示は、
このようになります。
Windows 環境、かつ PHP 7.4.0 より前のバージョンでは、
ルーティングを行うスクリプトがシンボリックリンク先の静的なリソースを処理しない限り、
それらのリソースにアクセスできませんでした。
ドキュメントルートディレクトリを指定した起動
ターミナルには次のように表示されます。
ルータースクリプトの使用
この例では、画像ファイルをリクエストすればそのまま表示し、HTML ファイルをリクエストすると "Welcome to PHP" と表示します。
Welcome to PHP";
}
?>]]>
CLI ウェブサーバーを使っているかどうかのチェック
フレームワークのルータースクリプトを、開発中は CLI ウェブサーバーで使って
その後は本番環境のウェブサーバーでも使うという例です。
]]>
未サポートのファイル形式の処理
CLI ウェブサーバーで対応していない MIME タイプの静的リソースを扱うには、このようにします。
]]>
CLI ウェブサーバーへのリモートマシンからのアクセス
ウェブサーバーを、任意のインターフェイスからポート 8000 でアクセスできるようにするには、このようにします。
ビルトインウェブサーバーは、公開ネットワークで使うべきではありません。
INI 設定
CLI SAPI の設定オプション
&Name;
&Default;
&Changeable;
&Changelog;
cli_server.color
"0"
INI_ALL
&ini.descriptions.title;
cli_server.color
bool
組み込みの開発用ウェブサーバーで、ANSI カラーコードを使ってターミナルに出力できるようにします。