4.3以降でPHPは Command Line Interfaceを意味する CLIという名前の新しいSAPI型 (Server Application Programming Interface)をサポートします。 名前から分かるように、このSAPI型は、 PHPによるシェル(またはデスクトップ)アプリケーショ ンの開発を主な対象としています。 CLI SAPIと他のSAPIの間には、 いくつかの違いがあります。本章では、これらについて詳細を説明します。
CLI SAPIは、当初PHP 4.2.0でリ リースされましたが、この時点では実験的なステータスにあったため、 ./configureを実行する際に、明示的に --enable-cliを指定することにより、有効とする必要 がありました。PHP 4.3.0以降、 CLI SAPIはもはや実験的なステータスではなくなりま した。このため、 常に構築され、 php(Windowsではphp.exeと いう名前となります)バイナリとしてインストールされます。
CLI SAPIを他のSAPIと比べた時 の大きな違いを以下に示します。
CGI SAPIと異なり、ヘッダが出力されません。
CGI SAPIは、HTTPヘッダの出力を抑制する機能を 提供していますが、等価な機能はCLI SAPIではサ ポートされていません。
以下に示すいくつかのphp.iniディレクティブは、CLI SAPIにより上書きされます。これは、シェル環境では意味が ないためです。
表 23-1上書きされるphp.iniのディレクティブ
ディレクティブ | CLI SAPIのデフォルト値 | コメント |
---|---|---|
html_errors | FALSE | エラーメッセージに含まれるHTMLタグはシェ ル上では意味がなく、可読性をかなり低下させるため、このディ レクティブはデフォルトでFALSEとなっています。 |
implicit_flush | TRUE | print(), echo()および 関連するものによる全ての出力は、直ちに出力され、バッファに キャッシュされないことが望ましいと言えます。この場合でも、 標準出力を保留または操作したい場合には、 output bufferingを使 用することが可能です。 |
max_execution_time | 0 (unlimited) | シェル環境では、PHPを際限なく使用できる ようにするために、最大実行時間の制限は無しに設定されていま す。Web用アプリケーションは数秒単位で実行されるよう作られて いますが、シェルアプリケーションの実行時間は、これよりかな り長くなる傾向があります。 |
register_argc_argv | TRUE | CLI SAPIを使用している場合、グローバル PHP変数$argc (アプリケーションに渡される引数の数)と $argv (引数の値の配列)は常に登録され、 適切な値が代入されます。 |
注意 これらのディレクティブは、設定ファイルphp.iniまたはカスタム設 定ファイル(指定した場合のみ)で他の値に初期化できません。この制 限は、これらのデフォルト値が全ての設定ファイルをパースした後に 適用されるためです。しかし、これらの値は実行時に変更することが 可能です。 (上記のディレクティブの全てについてこれが当てはまるわけではあり ません。例えば、register_argc_argv)
シェル環境での動作を容易とするために、以下の定数が定義されていま す。
表 23-2CLI固有の定数
定数 | 説明 | |
---|---|---|
STDIN |
stdinへのオープン済みのストリーム。これ
により、以下のようにオープンする必要がなくなります。
| |
STDOUT |
stdoutへのオープン済みのストリーム。これ
により、以下のようにオープンする必要がなくなります。
| |
STDERR |
stderrへのオープン済みのストリーム。これ
により、以下のようにオープンする必要がなくなります。
|
上記のように、stderrのようなストリームを自分 でオープンする必要はなく、以下のようにストリームリソースの代わり に定数を使用するだけでかまいません。
php -r 'fwrite(STDERR, "stderr\n");' |
CLI SAPIは、実行されるスクリプトのディレクト リにカレントディレクトリを変更しません !
CGI SAPIとの違いを示す例を以下に示します。
<?php /* Our simple test application */ echo getcwd(), "\n"; ?> |
CGI版により実行した場合、出力は以下のようにな ります。
$ pwd /tmp $ php-cgi -f another_directory/test.php /tmp/another_directory |
CLI SAPIを使用した場合の出力は次のようになり ます。
$ pwd /tmp $ php -f another_directory/test.php /tmp |
注意 CGI SAPIは、このCLI SAPI の動作をコマンドライン実行時のスイッチ-Cによ りサポートしています。
PHPバイナリにより提供されるコマンドラインオプショ ンの一覧は、-hスイッチを指定して PHPを実行することによりいつでも調べることができ ます。
Usage: php [options] [-f] <file> [args...] php [options] -r <code> [args...] php [options] [-- args...] -s Display colour syntax highlighted source. -w Display source with stripped comments and whitespace. -f <file> Parse <file>. -v Version number -c <path>|<file> Look for php.ini file in this directory -a Run interactively -d foo[=bar] Define INI entry foo with value 'bar' -e Generate extended information for debugger/profiler -z <file> Load Zend extension <file>. -l Syntax check only (lint) -m Show compiled in modules -i PHP information -r <code> Run PHP <code> without using script tags <?..?> -h This help args... Arguments passed to script. Use -- args when first argument starts with - or script is read from stdin |
CLI SAPIは、実行するPHPコード を取得するために三種類の異なる手段をサポートしています。
PHPに特定のファイルの実行を指示する。
php my_script.php php -f my_script.php |
実行するPHPコードをコマンドラインで直接指定する。
php -r 'print_r(get_defined_constants());' |
注意 この例をよくみて下さい。開始/終了タグがありません! -rスイッチを使用した場合、これらのタグは不要 となります。これらのタグを使用するとパーサエラーを発生します。
実行するPHPコードを標準入力 (stdin)で指定する。
これは強力な機能で、以下の(仮想的な)例に示すように、動的に PHPコードを生成し、実行バイナリに入力すること ができます。
$ some_application | some_filter | php | sort -u >final_output.txt |
他のシェルアプリケーションのように、PHPバイナリ に引数を指定することができるだけでなく、PHPスク リプトがこの引数を取得することも可能です。スクリプトに指定できる引 数の数はPHPによる制限を受けません。 (シェルは指定可能な文字数の最大値を設定しています。通常、この制限値 を越えることはできません。) スクリプトに指定した引数は、グローバル 配列$argvでアクセス可能です。 添字0は、常にスクリプト名が含まれています。 ( PHPコードが標準入力またはコマンドラインスイッ チ-rにより指定された場合、スクリプト名は -となります。) 登録される第2のグローバル変数は$argcで、 (スクリプトに指定された引数の数ではなく 、)配列$argvの要素数が含まれます。
スクリプトに指定する引数が文字-で始まっていない 限り、特に留意すべきことはありません。スクリプトに指定する引数が文 字-で始まる場合、PHP自体がこ れをパースする必要があるとみなすため、問題を発生します。 これを防止するため、引数リストセパレータ--を使用 して下さい。PHPにパースされる引数の後に このセパレータを置くと、その後の全ての引数はそのままパースされずに スクリプトに渡されます。
# This will not execute the given code but will show the PHP usage $ php -r 'var_dump($argv);' -h Usage: php [options] [-f] <file> [args...] [...] # This will pass the '-h' argument to your script and prevent PHP from showing it's usage $ php -r 'var_dump($argv);' -- -h array(2) { [0]=> string(1) "-" [1]=> string(2) "-h" } |
また、PHPをシェルスクリプトとして使用する他の 手段があります。最初の行が#!/usr/bin/phpで始まり、 PHPの開始/終了タグの中に通常の PHPコードが続くスクリプトを書き、適当なファイル 実行属性を設定することが可能です。この方法は、通常のシェル/Perlスク リプトと同様に実行することができます。
#!/usr/bin/php <?php var_dump($argv); ?> |
$ chmod 755 test $ ./test -h -- foo array(4) { [0]=> string(6) "./test" [1]=> string(2) "-h" [2]=> string(2) "--" [3]=> string(3) "foo" } |
表 23-3コマンドラインオプション
オプション | 説明 | |||
---|---|---|---|---|
-s |
カラー構文ハイライト表示されたソースを表示します。 このオプションは、ファイルをパースし、HTML ハイライト表示版のファイルを生成し、標準出力に書き出す内部機 構を使用します。行うのは、 <code> [...] </code>のブロック を生成することだけで、HTMLヘッダは出力され ないことに注意して下さい。
| |||
-w |
コメントと空白文字を削除してソースを表示します。
| |||
-f |
-fオプションに指定したファイル名をパースし、 実行します。このスイッチはオプションで省略することもできます。 実行するスクリプトを指定するだけで充分です。 | |||
-v |
PHP, PHP SAPI, Zendのバージョンを標準出力に出力します。例:
| |||
-c |
このオプションを使用することにより、php.iniを探すディレクト リを指定したり、カスタマイズされたINIファ イル(php.iniという名前である必要はありません)を直接指定する ことが可能です。例:
| |||
-a |
PHPを対話的に実行します。 | |||
-d |
このオプションにより php.ini で指定できる設定ディレクティブ にカスタム値を設定することができます。構文は以下のようになります。
例:
| |||
-e |
デバッガ/プロファイラ用の拡張情報を出力します。 | |||
-z |
Zendエクステンションをロードします。ファイル名のみが指定された場合、 PHPはこの拡張をカレントのシステムのデフォルトライブラリパスから ロードしようとします。 (Linuxシステムの場合は/etc/ld.so.confで 指定されています) ファイル名を絶対パスで指定した場合、システムのライブラリサーチパスを 使用しません。ディレクトリ情報を有する相対ファイル名を 指定すると、PHPは、 カレントのディレクトリの相対パスから拡張モジュールをロードする ことのみを行ないます。 | |||
-l |
このオプションにより、指定したPHPコードの 構文チェックのみを簡単に行なうことができます。成功した場合、 テキスト No syntax errors detected in <filename> が、標準出力に書き込まれ、リターンコードは0 となります。失敗した場合、テキスト Errors parsing <filename> に加えて、内部パーサエラーメッセージ が標準出力に書き込まれ、シェルリターンコードは、 255となります。 このオプションは、(未定義の関数のような)致命的なエラー(fatal error) はみつけません。致命的なエラーについても調べたい場合は、 -f を使用してください。
| |||
-m |
このオプションを使用すると、PHPは、PHPに組み込まれた (そしてロードされた) Zend モジュールを出力します。
| |||
-i | このコマンドラインオプションは、phpinfo()をコールし、 結果を出力します。PHP が正しく動作していない場合、 php -iを実行し、情報テーブルの前または中に出力 されるエラーメッセージを調べることをお勧めします。 出力は、HTML 形式で行なわれるため、かなり量が 多くなることに注意して下さい。 | |||
-r |
このオプションにより、コマンドラインのみでPHP の実行ができるようになります。 PHPの開始および終了タグ (<?php および ?>) は不要で、これらを付けると パーサエラーとなります。
| |||
-h | このオプションを使用すると、実際の一連のコマンドラインオプションと 各1行の説明が情報を取得できます。 |
PHP実行バイナリは、Webサーバから完全に独立してPHPスクリプトを実行す るために使用することができます。Unixシステムを使用している場合、実 行可能とするために、PHPスクリプトの先頭に特別な一行を追加する必要が あります。これにより、システムがそのスクリプトを実行するプログラム を知ることができます。 Windows環境では、.phpファイルのダブルクリックオ プションにphp.exeを関連づけることができます。 または、PHPによりスクリプトを実行するバッチファイルを作成することも 可能です。Unix上で動作させるためにスクリプトに追加された先頭行は、 Windows環境での動作に悪影響を与えません。このため、この手法により、 黒須プラットフォーム環境で動作するプログラムを書くことができます。 コマンドラインPHPプログラムの書方の簡単な例を以下に示します。
上のスクリプトでは、特殊な先頭行が用いられており、このファイルが PHPにより実行されることを示しています。ここではCLI版を使用しているため、 HTTPヘッダは出力されません。PHPで コマンドラインアプリケーションを使用する際には、2つの変数 $argc and $argv を使用することが できます。 最初の変数は、引数の数に1(実行中のスクリプトの名前)を加えたものです。 2番目の変数は、引数を保持する配列で、スクリプト名を有する 要素0($argv[0])から始まっています。
上のプログラムでは、引数が1より少ないかまたは多いかを調べています。 また、引数が --help, -help, -h, -?の場合、 ヘルプメッセージを出力し、動的にスクリプト名を出力します。 他の引数を受け取った場合、これを出力します。
上のスクリプトをUnixで実行する場合、実行可能とした後、 script.php echothis または script.php -h とする必要があります。 Windowsでは、この処理を行なう以下のようなバッチファイルを作成することが できます。
上のプログラムがscript.phpという名前であると し、c:\php\php.exeにphp.exe があるとすると、このバッチファイルは、追加したオプション script.bat echothis または script.bat -h を指定して、スクリプトを実行します。
PHPのコマンドラインアプリケーションを拡張するために使用できる その他の関数については、拡張モジュール Readlineに関する ドキュメントも参照してください。