1
0
mirror of https://github.com/php/doc-ja.git synced 2026-03-24 07:02:08 +01:00
Files
archived-doc-ja/features/commandline.xml
KentarouTakeda 768e8d6ed7 軽微な差分を優先し26ファイルを既訳更新 (#349)
- reference/mbstring/functions/mb-decode-numericentity.xml
  1. php/doc-en@4e69a9f2b1
- reference/imap/functions/imap-headerinfo.xml
  1. php/doc-en@4e69a9f2b1
- reference/ssh2/functions/ssh2-auth-pubkey-file.xml
  1. php/doc-en@74ef2355c5
- reference/ssh2/functions/ssh2-connect.xml
  1. php/doc-en@74ef2355c5
- reference/stream/functions/stream-filter-append.xml
  1. php/doc-en@a684294e0b
- reference/stream/functions/stream-filter-prepend.xml
  1. php/doc-en@a684294e0b
- reference/filesystem/functions/fgetcsv.xml
  1. php/doc-en@e1fd0bef1d
  2. php/doc-en@0a3648a718
  3. `&warning.csv.escape-parameter;` の重複を削除(既訳のバグ修正)
- reference/spl/splfileobject/fgetcsv.xml
  1. php/doc-en@e1fd0bef1d
  2. php/doc-en@3a89b55d11
  3. php/doc-en@0a3648a718
- language/predefined/attributes/nodiscard.xml
  1. php/doc-en@30bda33771
- reference/pdo_sqlite/pdo/sqlite/createfunction.xml
  1. php/doc-en@28930349ca
- reference/math/functions/fmod.xml
  1. php/doc-en@54a788ca59
- reference/simplexml/simplexmlelement/addChild.xml
  1. php/doc-en@dca2a8354f
- reference/json/functions/json-last-error.xml
  1. php/doc-en@058ea1e842
- features/commandline.xml
  1. php/doc-en@96b10a9885
- appendices/migration85/incompatible.xml
  1. php/doc-en@048982b729
  2. php/doc-en@f81bbcf9d3
- reference/random/random/randomizer/getfloat.xml
  1. php/doc-en@1ada637cc8
  2. php/doc-en@423a1da63f
- reference/mysqli/mysqli/multi-query.xml
  1. php/doc-en@1beae37b69
- reference/image/functions/getimagesize.xml
  1. php/doc-en@6bb90d24b2
- reference/curl/functions/curl-close.xml
  1. php/doc-en@86c8ebd19e
- reference/curl/functions/curl-share-close.xml
  1. php/doc-en@29c3d13980
- reference/yaml/functions/yaml-parse-file.xml
  1. php/doc-en@132d2a8d63
- reference/mysqli/mysqli/options.xml
  1. php/doc-en@e309a62b16
  2. MYSQLI_SERVER_PUBLIC_KEY の古い「PHP 5.5.0 以降」テキストを削除(既訳のバグ修正)
- appendices/transports.xml
  1. php/doc-en@ae90ecc932
- reference/soap/soapserver/addfunction.xml
  1. php/doc-en@577239f64b
- reference/var/functions/settype.xml
  1. php/doc-en@8d49e302b4
- features/http-auth.xml
  1. php/doc-en@cd4180557a
2026-03-10 08:58:57 +09:00

2031 lines
71 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 96b10a98853e3b8236504e5775f95eb4a15c82c3 Maintainer: takagi Status: ready -->
<!-- CREDITS: hirokawa,shimooka,mumumu -->
<chapter xml:id="features.commandline" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>PHP をコマンドラインから使用する</title>
<titleabbrev>コマンドラインの使用法</titleabbrev>
<!--Introduction: {{{-->
<section xml:id="features.commandline.introduction" annotations="chunk:false">
<title>はじめに</title>
<para>
&cli.sapi; の主な目的は、シェルアプリケーションを PHP
で開発することです。&cli.sapi; とその他の
<acronym>SAPI</acronym> の間にはちょっとした違いがあり、
それを本章で説明します。&cli;<acronym>CGI</acronym>
は多くの共通点がありますが、別の <acronym>SAPI</acronym>
であるということも覚えておきましょう。
</para>
<para>
&cli.sapi; は、
<option role="configure">--enable-cli</option> でデフォルトで有効となっています。
<command>./configure</command> の際に
<option role="configure">--disable-cli</option> オプションを指定して無効にすることもできます。
</para>
<para>
&cli;/<acronym>CGI</acronym> バイナリの名前、位置、そして存在するかどうかは
PHP がどのようにインストールされているかによって異なります。デフォルトで
<command>make</command> を実行したときには、<acronym>CGI</acronym>
&cli; が両方ビルドされて、それぞれ PHP ソースディレクトリの <filename>sapi/cgi/php-cgi</filename>
<filename>sapi/cli/php</filename> にできあがります。
両方とも <filename>php</filename> という名前であることに注意しましょう。
<command>make install</command> のときにどうなるかは、configure
行に依存します。
configure で例えば apxs のような <acronym>SAPI</acronym> モジュールが選択された場合、または
<option role="configure">--disable-cgi</option> が指定された場合、
<command>make install</command> によって &cli;<filename>{PREFIX}/bin/php</filename>
にコピーされます。さもなければ <acronym>CGI</acronym> がそこにコピーされます。
つまり、たとえば configure で <option role="configure">--with-apxs </option>
を指定すると、<command>make install</command> での &cli; のコピー先は
<filename>{PREFIX}/bin/php</filename> となります。
既にインストールされている <acronym>CGI</acronym> バイナリを上書きしたい場合には、
<command>make install</command> の後に <command>make install-cli</command>
を実行してください。あるいは configure で
<option role="configure">--disable-cgi</option> を指定することもできます。
</para>
<note>
<para>
<option role="configure">--enable-cli</option>
<option role="configure">--enable-cgi</option>
の両方がデフォルトで有効になっています。そのため、configure で
<option role="configure">--enable-cli</option>
を指定したからといって、<command>make install</command>
<filename>{PREFIX}/bin/php</filename>
にコピーされるのが必ずしも &cli; になるとは限りません。
</para>
</note>
<para>
Windows 版の &cli; はメインフォルダ内で <filename>php.exe</filename>
という名前で配布されます。<acronym>CGI</acronym> バージョンは、<filename>php-cgi.exe</filename>
として配布されます。さらに
configure で <option role="configure">--enable-cli-win32</option>
を指定すると、新しく <filename>php-win.exe</filename> というファイルが配布されます。
これは &cli; バージョンとほぼ同じですが、何も出力しないため、コンソールは必要ありません。
</para>
<note>
<title>自分の SAPI は何か?</title>
<para>
シェルで <command>php -v</command> をタイプすると、
<filename>php</filename><acronym>CGI</acronym> なのか &cli; なのかわかります。
<function>php_sapi_name</function> と定数 <constant>PHP_SAPI</constant>
も参照ください。
</para>
</note>
<note>
<para>
Unix の <literal>man</literal> ページは、
シェル環境から <command>man php</command> とすれば見ることができます。
</para>
</note>
</section>
<!--}}}-->
<!--Differences: {{{-->
<section xml:id="features.commandline.differences">
<title>他の <acronym>SAPI</acronym> との違い</title>
<para>
&cli; <acronym>SAPI</acronym> を他の <acronym>SAPI</acronym> と比べた時の
大きな違いを以下に示します。
<itemizedlist>
<listitem>
<para>
<acronym>CGI</acronym> <acronym>SAPI</acronym> と異なり、ヘッダが出力されません。
</para>
<para>
<acronym>CGI</acronym> <acronym>SAPI</acronym> は HTTP ヘッダの出力を抑制する機能を
提供していますが、等価な機能は &cli.sapi; ではサポートされていません。
</para>
<para>
デフォルトでは &cli; は静寂モードで起動されます。古い <acronym>CGI</acronym> スクリプトと互換性を
保って使えるように <option>-q</option> および <option>--no-header</option> スイッチが残されています。
</para>
<para>
作業ディレクトリをスクリプトの場所に変更しません
(<option>-C</option> および <option>--no-chdir</option> スイッチは
互換性のために残されています)。
</para>
<para>
エラーメッセージはプレーンテキスト (<acronym>HTML</acronym> フォーマットはしない)
で表示されます。
</para>
</listitem>
<listitem>
<para>
以下に示すいくつかの &php.ini; ディレクティブは、&cli.sapi;
により上書きされます。これは、シェル環境では意味がないためです。
</para>
<para>
<table>
<title>上書きされる &php.ini; のディレクティブ</title>
<tgroup cols="3">
<thead>
<row>
<entry>ディレクティブ</entry>
<entry>&cli; <acronym>SAPI</acronym> のデフォルト値</entry>
<entry>コメント</entry>
</row>
</thead>
<tbody>
<row>
<entry><link linkend="ini.html-errors">html_errors</link></entry>
<entry>&false;</entry>
<entry>
エラーメッセージに含まれる <acronym>HTML</acronym> タグは
シェル上では意味がなく、可読性をかなり低下させるため、この
ディレクティブはデフォルトで &false; となっています。
</entry>
</row>
<row>
<entry><link linkend="ini.implicit-flush">implicit_flush</link></entry>
<entry>&true;</entry>
<entry>
シェル環境では、
<function>print</function>, <function>echo</function> および
関連するものによる全ての出力は、直ちに出力され、バッファに
保持されないことが望ましいと言えます。この場合でも、
標準出力を保留または操作したい場合には、
<link linkend="ref.outcontrol">出力バッファリング</link>
を使用することが可能です。
</entry>
</row>
<row>
<entry><link linkend="ini.max-execution-time">max_execution_time</link></entry>
<entry>0 (無制限)</entry>
<entry>
シェル環境では、PHP を際限なく使用できる
ようにするために、最大実行時間の制限は無しに設定されています。
Web 用アプリケーションは数秒単位で実行されるよう作られて
いますが、シェルアプリケーションの実行時間は、これよりかなり
長くなる傾向があります。
</entry>
</row>
<row>
<entry><link linkend="ini.register-argc-argv">register_argc_argv</link></entry>
<entry>&true;</entry>
<entry>
<para>
この設定が &true; なので、&cli; <acronym>SAPI</acronym> では常に
<emphasis>argc</emphasis> (アプリケーションに渡した引数の数)
および <emphasis>argv</emphasis> (実際の引数の配列)
を使うことができます。
</para>
<para>
&cli; <acronym>SAPI</acronym> を使用するときに
PHP の <varname>$argc</varname> 変数と
<varname>$argv</varname> 変数が登録され、適切な値がセットされます。
あるいは <varname>$_SERVER</varname>
<varname>$_SERVER['argv']</varname> を使うこともできます。
</para>
<warning>
<para>
<varname>$argv</varname><varname>$_SERVER['argv']</varname>
が存在することは、PHPスクリプトがコマンドラインから実行されていることを示す信頼できる根拠にはなりません。
なぜなら、<link linkend="ini.register-argc-argv">register_argc_argv</link>
が有効になっている場合に、他のコンテキストで設定されている可能性があるからです。
コマンドラインから実行されていることを確認するには、代わりに <function>php_sapi_name</function> の返り値をチェックすべきです。
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
if (php_sapi_name() === 'cli') {
echo "This is being run from the command line!\n";
}
]]>
</programlisting>
</informalexample>
</para>
</warning>
</entry>
</row>
<row>
<entry><link linkend="ini.output-buffering">output_buffering</link></entry>
<entry>&false;</entry>
<entry>
<para>
&php.ini;&false; とハードコードされていても、
<link linkend="book.outcontrol">出力バッファリング</link>
関数は使用可能です。
</para>
</entry>
</row>
<row>
<entry><link linkend="ini.max-input-time">max_input_time</link></entry>
<entry>&false;</entry>
<entry>
<para>
PHP &cli; は GET、POST あるいはファイルのアップロードをサポートしません。
</para>
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<note>
<para>
これらのディレクティブは、設定ファイル &php.ini; またはカスタム
設定ファイル(指定した場合のみ)で他の値に初期化できません。
この制限は、これらのデフォルト値が全ての設定ファイルをパースした後に
適用されるためです。しかし、これらの値は実行時に変更することが
可能です
(上記のディレクティブの全てについてこれが当てはまるわけでは
ありません。例えば、<link
linkend="ini.register-argc-argv">register_argc_argv</link>)。
</para>
</note>
<note>
<para>
コマンドラインのスクリプトでは
<link linkend="ini.ignore-user-abort">ignore_user_abort</link>
を設定することを推奨します。詳細は <function>ignore_user_abort</function>
を参照ください。
</para>
</note>
</listitem>
<listitem>
<para>
シェル環境での利便性を考慮して、
<link linkend="features.commandline.io-streams">I/O ストリーム
</link> 用に多くの定数が定義されています。
</para>
</listitem>
<listitem>
<para>
&cli.sapi; は、カレントディレクトリをスクリプトのディレクトリに変更
<emphasis role="strong">しません</emphasis>!
</para>
<example>
<title>
<acronym>CGI</acronym> <acronym>SAPI</acronym> との違いを示す例
</title>
<programlisting role="php">
<![CDATA[
<?php
// test.php という名前のシンプルなテストアプリケーション
echo getcwd(), "\n";
?>
]]>
</programlisting>
<para>
<acronym>CGI</acronym> 版を使った場合、出力は以下のようになります。
</para>
<screen>
<![CDATA[
$ pwd
/tmp
$ php -q another_directory/test.php
/tmp/another_directory
]]>
</screen>
<para>
これは、PHP がカレントディレクトリを
スクリプトのディレクトリに変更することを明らかに示しています。
</para>
<para>
&cli.sapi; を使った場合はこのようになります。
</para>
<screen>
<![CDATA[
$ pwd
/tmp
$ php -f another_directory/test.php
/tmp
]]>
</screen>
<para>
これにより、PHP でシェルツールを書く際の柔軟性をより大きくすることができます。
</para>
</example>
<note>
<para>
<acronym>CGI</acronym> <acronym>SAPI</acronym> は、この &cli.sapi;
の動作をコマンドライン実行時のスイッチ <literal>-C</literal>
によりサポートしています。
</para>
</note>
</listitem>
</itemizedlist>
</para>
</section>
<!--}}}-->
<!--Options: {{{-->
<section xml:id="features.commandline.options">
<title>コマンドラインオプション</title>
<titleabbrev>オプション</titleabbrev>
<para>
PHP バイナリにより提供されるコマンドラインオプションの一覧は、
<option>-h</option> スイッチを指定して PHP を実行することにより
いつでも調べることができます。
<screen>
<![CDATA[
Usage: php [options] [-f] <file> [--] [args...]
php [options] -r <code> [--] [args...]
php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]
php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]
php [options] -- [args...]
php [options] -a
-a Run interactively
-c <path>|<file> 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 <file> Parse and execute <file>.
-h This help
-i PHP information
-l Syntax check only (lint)
-m Show compiled in modules
-r <code> Run PHP <code> without using script tags <?..?>
-B <begin_code> Run PHP <begin_code> before processing input lines
-R <code> Run PHP <code> for every input line
-F <file> Parse and execute <file> for every input line
-E <end_code> Run PHP <end_code> after processing all input lines
-H Hide any passed arguments from external tools.
-S <addr>:<port> Run with built-in web server.
-t <docroot> Specify document root <docroot> for built-in web server.
-s Output HTML syntax highlighted source.
-v Version number
-w Output source with stripped comments and whitespace.
-z <file> Load Zend extension <file>.
args... Arguments passed to script. Use -- args when first argument
starts with - or script is read from stdin
--ini Show configuration file names
--rf <name> Show information about function <name>.
--rc <name> Show information about class <name>.
--re <name> Show information about extension <name>.
--rz <name> Show information about Zend extension <name>.
--ri <name> Show configuration for extension <name>.
]]>
</screen>
</para>
<para>
<table>
<title>コマンドラインオプション</title>
<tgroup cols="2">
<thead>
<row>
<entry>オプション</entry>
<entry>長い形式のオプション</entry>
<entry>説明</entry>
</row>
</thead>
<tbody>
<row>
<entry>-a</entry>
<entry>--interactive</entry>
<entry>
<para>
PHP を対話的に実行します。詳細な情報は、<link
linkend="features.commandline.interactive">対話シェル</link>
を参照ください。
</para>
</entry>
</row>
<row>
<entry>-b</entry>
<entry>--bindpath</entry>
<entry>
<para>
外部 FASTCGI サーバーモードでのバインドパス (<acronym>CGI</acronym>
のみ)。
</para>
</entry>
</row>
<row>
<entry>-C</entry>
<entry>--no-chdir</entry>
<entry>
<para>
スクリプトのディレクトリへ chdir しません (<acronym>CGI</acronym> のみ)。
</para>
</entry>
</row>
<row>
<entry>-q</entry>
<entry>--no-header</entry>
<entry>
<para>
静寂モード。<acronym>HTTP</acronym> ヘッダの出力を抑制します
(<acronym>CGI</acronym> のみ)。
</para>
</entry>
</row>
<row>
<entry>-T</entry>
<entry>--timing</entry>
<entry>
<para>
スクリプトを <varname>count</varname> 回繰り返して実行した時間を計測します
(<acronym>CGI</acronym> のみ)。
</para>
</entry>
</row>
<row>
<entry>-c</entry>
<entry>--php-ini</entry>
<entry>
<para>
このオプションを使用することにより、&php.ini; を探すディレクトリを
指定したり、カスタマイズされた <literal>INI</literal> ファイル
(&php.ini; という名前である必要はありません)を直接指定する
ことが可能です。例:
</para>
<para><informalexample>
<screen>
<![CDATA[
$ php -c /custom/directory/ my_script.php
$ php -c /custom/directory/custom-file.ini my_script.php
]]>
</screen>
</informalexample></para>
<para>
このオプションを指定しない場合、ファイルは、
<link linkend="configuration.file">デフォルトの位置</link>
で探索されます。
</para>
</entry>
</row>
<row>
<entry>-n</entry>
<entry>--no-php-ini</entry>
<entry>
<para>
&php.ini; を完全に無視します。
</para>
</entry>
</row>
<row>
<entry>-d</entry>
<entry>--define</entry>
<entry>
<para>
このオプションにより &php.ini; で指定できる設定ディレクティブに
カスタム値を設定することができます。構文は以下のようになります。
<screen>
<![CDATA[
-d configuration_directive[=value]
]]>
</screen>
</para>
<para><example>
<title>INI 設定に <literal>-d</literal> を使って値を設定する例</title>
<screen>
<![CDATA[
# 値の部分を省略すると、設定ディレクティブに"1"を指定します
$ php -d max_execution_time
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(1) "1"
# 空の値を渡すと設定ディレクティブに""を設定します
php -d max_execution_time=
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(0) ""
# 設定ディレクティブは文字'='の後に指定したものを設定します
$ php -d max_execution_time=20
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(2) "20"
$ php
-d max_execution_time=doesntmakesense
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(15) "doesntmakesense"
]]>
</screen>
</example></para>
</entry>
</row>
<row>
<entry>-e</entry>
<entry>--profile-info</entry>
<entry>
<para>
デバッガ/プロファイラ用の拡張情報を出力します。
</para>
</entry>
</row>
<row>
<entry>-f</entry>
<entry>--file</entry>
<entry>
<para>
<option>-f</option> オプションに指定したファイル名をパースし、
実行します。このスイッチはオプションで省略することもできます。
実行するスクリプトを指定するだけで充分です。
</para>
</entry>
</row>
<row>
<entry>-h and -?</entry>
<entry>--help and --usage</entry>
<entry>
このオプションを使用すると、実際の一連のコマンドラインオプションと
各1行の説明が情報を取得できます。
</entry>
</row>
<row>
<entry>-i</entry>
<entry>--info</entry>
<entry>
このコマンドラインオプションは、<function>phpinfo</function> をコールし、
結果を出力します。PHP が正しく動作していない場合、
<command>php -i</command> を実行し、情報テーブルの前または中に
出力されるエラーメッセージを調べることをお勧めします。
<acronym>CGI</acronym> モードの場合、
出力が <acronym>HTML</acronym> 形式で行なわれるため
量がかなり多くなることに注意してください。
</entry>
</row>
<row>
<entry>-l</entry>
<entry>--syntax-check</entry>
<entry>
<para>
構文チェックを行いますが、指定された PHP コードは実行しません。
ファイル名が指定されない場合、標準出力の入力をチェックしますが、
指定された場合、それぞれのファイルがチェックされます。
成功した場合、
テキスト
<literal>No syntax errors detected in &lt;filename&gt;</literal>
が標準出力に書き込まれ、リターンコードは <literal>0</literal>
になります。失敗した場合は
テキスト <literal>Errors parsing
&lt;filename&gt;</literal> に加え、内部パーサーエラーメッセージ
が標準出力に書き込まれ、シェルリターンコードは、
<literal>-1</literal> となります。
</para>
<para>
このオプションは、(未定義の関数のような)致命的なエラー(fatal error)
を見つけることはありません。そうするためには、
コード全体を実行する必要があるからです。
</para>
<note>
<para>
PHP 8.3.0 より前のバージョンでは、
構文チェックできるファイルの数は一つだけでした。
</para>
</note>
<note>
<para>
このオプションは、オプション <option>-r</option> と共に使用することは
できません。
</para>
</note>
</entry>
</row>
<row>
<entry>-m</entry>
<entry>--modules</entry>
<entry>
<para><example>
<title>PHP に組み込まれた (そしてロードされた) Zend モジュールの表示</title>
<screen>
<![CDATA[
$ php -m
[PHP Modules]
xml
tokenizer
standard
session
posix
pcre
overload
mysql
mbstring
ctype
[Zend Modules]
]]>
</screen>
</example></para>
</entry>
</row>
<row>
<entry>-r</entry>
<entry>--run</entry>
<entry>
<para>
このオプションにより、コマンドラインのみで PHP
の実行ができるようになります。
PHP の開始および終了タグ
(<literal>&lt;?php</literal> および <literal>?&gt;</literal>)
<emphasis role="strong">不要</emphasis>で、これらを付けると
パーサーエラーとなります。
</para>
<note>
<para>
このように PHP を実行する際に、コマンドラインの
変数がシェルにより行なわれる置換と干渉しないように注意してください。
</para>
<example>
<title>ダブルクォートの使用時に構文エラーが出る例</title>
<screen>
<![CDATA[
$ php -r "$foo = get_defined_constants();"
PHP Parse error: syntax error, unexpected '=' in Command line code on line 1
Parse error: syntax error, unexpected '=' in Command line code on line 1
]]>
</screen>
</example>
<para>
ここでの問題は、2 重引用符 <literal>"</literal> を用いた場合でも
sh/bash が変数置換を行うことです。
<varname>$foo</varname> はおそらく定義されていないので、
空文字列に展開された後、実行用に PHP に
そのコードが渡され、以下のように読み込むことになります。
</para>
<informalexample>
<screen>
<![CDATA[
$ php -r " = get_defined_constants();"
]]>
</screen>
</informalexample>
<para>
正しい方法は、1 重引用符<literal>'</literal>を使用することです。
1 重引用符で括られた文字列の中の変数は、sh/bash により展開されません。
</para>
<example>
<title>シングルクォートを使い、シェルの変数置換を防ぐ例</title>
<screen>
<![CDATA[
$ php -r '$foo = get_defined_constants(); var_dump($foo);'
array(370) {
["E_ERROR"]=>
int(1)
["E_WARNING"]=>
int(2)
["E_PARSE"]=>
int(4)
["E_NOTICE"]=>
int(8)
["E_CORE_ERROR"]=>
[...]
]]>
</screen>
</example>
<para>
sh/bash 以外のシェルを使用している場合には、別の問題を経験したことが
あるかもしれません。バグを
<link xlink:href="&url.php.bugs;">&url.php.bugs;</link>
に報告してください。
シェル変数をコードに取得しようとしたり、エスケープを行なうために
バックスラッシュを使用したりした場合にも、容易に問題を発生する
可能性があります。注意が必要です。
</para>
</note>
<note>
<para>
<option>-r</option>&cli.sapi; で有効で、
<emphasis>CGI</emphasis> <acronym>SAPI</acronym> では使用できません。
</para>
</note>
<note>
<para>
このオプションはあくまで基本的な機能を提供するものです。そのため、
いくつかの設定ディレクティブ(例: <link
linkend="ini.auto-prepend-file">auto_prepend_file</link> および <link
linkend="ini.auto-append-file">auto_append_file</link>)は
このモードでは無視されます。
</para>
</note>
</entry>
</row>
<row>
<entry>-B</entry>
<entry>--process-begin</entry>
<entry>
<para>
標準入力を処理する前に実行する PHP コードを指定します。
</para>
</entry>
</row>
<row>
<entry>-R</entry>
<entry>--process-code</entry>
<entry>
<para>
それぞれの入力行に対して実行する PHP コードを指定します。
</para>
<para>
このモードには 2 つの特別な変数
<varname>$argn</varname><varname>$argi</varname>
が用意されています。
<varname>$argn</varname> は PHP がその瞬間に処理している行を含み、
<varname>$argi</varname> はその行番号を含んでいます。
</para>
</entry>
</row>
<row>
<entry>-F</entry>
<entry>--process-file</entry>
<entry>
<para>
全ての入力行に対して実行する PHP ファイルを指定します。
</para>
</entry>
</row>
<row>
<entry>-E</entry>
<entry>--process-end</entry>
<entry>
<para>
入力を処理した後に実行する PHP コードを指定します。
</para>
<para><example>
<title>とあるプロジェクトの行数をカウントするための
<option>-B</option>, <option>-R</option> そして <option>-E</option>
オプションの使用例
</title>
<screen>
<![CDATA[
$ find my_proj | php -B '$l=0;' -R '$l += count(@file($argn));' -E 'echo "Total Lines: $l\n";'
Total Lines: 37328
]]>
</screen>
</example></para>
</entry>
</row>
<row>
<entry>-S</entry>
<entry>--server</entry>
<entry>
<para>
<link linkend="features.commandline.webserver">ビルトインウェブサーバー</link>
を開始させます。
</para>
</entry>
</row>
<row>
<entry>-t</entry>
<entry>--docroot</entry>
<entry>
<link linkend="features.commandline.webserver">ビルトインウェブサーバー</link>
のドキュメントルートを指定します。
</entry>
</row>
<row>
<entry>-s</entry>
<entry>--syntax-highlight と --syntax-highlighting</entry>
<entry>
<para>
カラー構文ハイライト表示されたソースを表示します。
</para>
<para>
このオプションは、ファイルをパースし、HTML
ハイライト表示版のファイルを生成し、標準出力に書き出す内部機
構を使用します。行うのは
<literal>&lt;code&gt; [...] &lt;/code&gt;</literal> のブロックを
生成することだけで、HTML ヘッダは
出力されないことに注意してください。
</para>
<note>
<para>
このオプションは、<option>-r</option> オプションと同時に
使用することはできません。
</para>
</note>
</entry>
</row>
<row>
<entry>-v</entry>
<entry>--version</entry>
<entry>
<para><example>
<title><option>-v</option> による、<acronym>SAPI</acronym>
名および PHP と Zend のバージョンの取得</title>
<screen>
<![CDATA[
$ php -v
PHP 5.3.1 (cli) (built: Dec 11 2009 19:55:07)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
]]>
</screen>
</example></para>
</entry>
</row>
<row>
<entry>-w</entry>
<entry>--strip</entry>
<entry>
<para>
コメントと空白文字を削除してソースを表示します。
</para>
<note>
<para>
このオプションは、<option>-r</option> オプションと同時に
使用することはできません。
</para>
</note>
</entry>
</row>
<row>
<entry>-z</entry>
<entry>--zend-extension</entry>
<entry>
<para>
Zend 拡張モジュールをロードします。ファイル名のみが指定された場合、
PHP はこの拡張をカレントのシステムのデフォルトライブラリパスから
ロードしようとします
(Linux システムの場合は <filename>/etc/ld.so.conf</filename>
指定されています)。
ファイル名を絶対パスで指定した場合、システムのライブラリサーチパスを
使用しません。ディレクトリ情報を有する相対ファイル名を
指定すると、PHP は
カレントのディレクトリの相対パスから拡張モジュールをロードする
ことのみを行ないます。
</para>
</entry>
</row>
<row>
<entry></entry>
<entry>--ini</entry>
<entry>
<para>
設定ファイルの名前、設定ファイルを検索するディレクトリを表示します。
<example>
<title><literal>--ini</literal> の例</title>
<programlisting role="shell">
<![CDATA[
$ php --ini
Configuration File (php.ini) Path: /usr/dev/php/5.2/lib
Loaded Configuration File: /usr/dev/php/5.2/lib/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed: (none)
]]>
</programlisting>
</example>
</para>
</entry>
</row>
<row>
<entry>--rf</entry>
<entry>--rfunction</entry>
<entry>
<para>
指定した関数あるいはクラスメソッドについての情報
(たとえばパラメータの数と名前など) を表示します。
</para>
<para>
このオプションは、PHP が
<link linkend="book.reflection">リフレクション</link>
のサポートつきでコンパイルされている場合にのみ使用可能です。
</para>
<para>
<example>
<title>基本的な <literal>--rf</literal> の使用法</title>
<programlisting role="shell">
<![CDATA[
$ php --rf var_dump
Function [ <internal> public function var_dump ] {
- Parameters [2] {
Parameter #0 [ <required> $var ]
Parameter #1 [ <optional> $... ]
}
}
]]>
</programlisting>
</example>
</para>
</entry>
</row>
<row>
<entry>--rc</entry>
<entry>--rclass</entry>
<entry>
<para>
指定したクラスについての情報 (定数、プロパティおよびメソッドの一覧)
を表示します。
</para>
<para>
このオプションは、PHP が
<link linkend="book.reflection">リフレクション</link>
のサポートつきでコンパイルされている場合にのみ使用可能です。
</para>
<para>
<example>
<title><literal>--rc</literal> の例</title>
<programlisting role="shell">
<![CDATA[
$ php --rc Directory
Class [ <internal:standard> class Directory ] {
- Constants [0] {
}
- Static properties [0] {
}
- Static methods [0] {
}
- Properties [0] {
}
- Methods [3] {
Method [ <internal> public method close ] {
}
Method [ <internal> public method rewind ] {
}
Method [ <internal> public method read ] {
}
}
}
]]>
</programlisting>
</example>
</para>
</entry>
</row>
<row>
<entry>--re</entry>
<entry>--rextension</entry>
<entry>
<para>
指定した拡張モジュールについての情報 (&php.ini; オプション、
定義されている関数、定数およびクラスの一覧) を表示します。
</para>
<para>
このオプションは、PHP が
<link linkend="book.reflection">リフレクション</link>
のサポートつきでコンパイルされている場合にのみ使用可能です。
</para>
<para>
<example>
<title><literal>--re</literal> の例</title>
<programlisting role="shell">
<![CDATA[
$ php --re json
Extension [ <persistent> extension #19 json version 1.2.1 ] {
- Functions {
Function [ <internal> function json_encode ] {
}
Function [ <internal> function json_decode ] {
}
}
}
]]>
</programlisting>
</example>
</para>
</entry>
</row>
<row>
<entry>--rz</entry>
<entry>--rzendextension</entry>
<entry>
<para>
指定した Zend 拡張モジュールについての情報
(<function>phpinfo</function> が返す情報と同じもの)
を表示します。
</para>
</entry>
</row>
<row>
<entry>--ri</entry>
<entry>--rextinfo</entry>
<entry>
<para>
指定した拡張モジュールについての設定情報 (<function>phpinfo</function>
が返す情報と同じもの) を表示します。
コア機能に関する設定情報は、
"main" というモジュール名で取得できます。
</para>
<para>
<example>
<title><literal>--ri</literal> の例</title>
<programlisting role="shell">
<![CDATA[
$ php --ri date
date
date/time support => 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
]]>
</programlisting>
</example>
</para>
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<note>
<para>
オプション <literal>-rBRFEH</literal><literal>--ini</literal> および
<literal>--r[fcezi]</literal>&cli; でのみ使用可能です。
</para>
</note>
</section>
<!--}}}-->
<!--Usage: {{{-->
<section xml:id="features.commandline.usage">
<title>PHP ファイルの実行</title>
<titleabbrev>PHP ファイルの実行</titleabbrev>
<para>
&cli.sapi; は、実行する PHP コードを
取得するために三種類の異なる手段をサポートしています。
<orderedlist>
<listitem>
<para>
PHP に特定のファイルの実行を指示する。
</para>
<informalexample>
<screen>
<![CDATA[
$ php my_script.php
$ php -f my_script.php
]]>
</screen>
</informalexample>
<para>
上記の方法は共に(<option>-f</option> スイッチの使用の如何に関らず)
指定したファイル <filename>my_script.php</filename> を実行します。
実行ファイルとしてあらゆるファイルを指定することができ、
PHP スクリプトは拡張子
<literal>.php</literal> で終わる必要がなく、任意の名前や拡張子を
使用することができます。
</para>
</listitem>
<listitem>
<para>
実行する PHP コードをコマンドラインで直接指定する。
</para>
<informalexample>
<screen>
<![CDATA[
$ php -r 'print_r(get_defined_constants());'
]]>
</screen>
</informalexample>
<para>
シェル変数の置換と引用符の使用については特に注意してください。
</para>
<note>
<para>
この例をよくみてください。開始/終了タグがありません!
<option>-r</option> スイッチを使用した場合、これらのタグは不要と
なります。これらのタグを使用するとパーサーエラーを発生します。
</para>
</note>
</listitem>
<listitem>
<para>
実行する PHP コードを標準入力
(<literal>stdin</literal>)で指定する。
</para>
<para>
これは強力な機能で、以下の(仮想的な)例に示すように、動的に
PHP コードを生成し、実行バイナリに入力すること
ができます。
</para>
<informalexample>
<screen>
<![CDATA[
$ some_application | some_filter | php | sort -u > final_output.txt
]]>
</screen>
</informalexample>
</listitem>
</orderedlist>
これらのコードを実行する三種類の方法を組み合わせて使用することはできません。
</para>
<para>
他のシェルアプリケーションのように、PHP バイナリに
引数を指定することができるだけでなく、PHP スクリプトが
この引数を取得することも可能です。スクリプトに指定できる
引数の数は PHP による制限を受けません
(シェルは指定可能な文字数の最大値を設定しています。通常、この制限値を
越えることはできません)。スクリプトに指定した引数は、グローバル配列
<varname>$argv</varname> でアクセス可能です。
最初のインデックス (添字 0) には常に、
コマンドラインからコールしたスクリプト名が含まれています。
コマンドラインスイッチ
<option>-r</option> を使ってインラインでコードを実行した場合は、
<varname>$argv[0]</varname> の値は <literal>"Standard input code"</literal>
となることに注意しましょう。
PHP 7.2.0 より前のバージョンでは、
ダッシュ (<literal>-</literal>) でした。
<constant>STDIN</constant>
の内容をパイプ経由で実行した場合も同じです。
</para>
<para>
登録される第 2 のグローバル変数は <varname>$argc</varname>
(スクリプトに指定された引数の数では<emphasis role="strong">なく
</emphasis>)、配列 <varname>$argv</varname> の要素数が含まれます。
</para>
<para>
スクリプトに指定する引数が文字 <literal>-</literal> で始まっていない
限り、特に留意すべきことはありません。スクリプトに指定する引数が文字
<literal>-</literal> で始まる場合、PHP 自体がこれを
パースする必要があるとみなすため、問題を発生します。
これを防止するため、引数リストセパレータ <literal>--</literal>
使用してください。PHP にパースされる引数の後に
このセパレータを置くと、その後の全ての引数はそのままパースされずに
スクリプトに渡されます。
</para>
<informalexample>
<screen>
<![CDATA[
# これは、指定したコードを実行せずに PHP の使用法を示します
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] <file> [args...]
[...]
# これは '-h' を引数として解釈し、PHP の使用法を表示しません
$ php -r 'var_dump($argv);' -- -h
array(2) {
[0]=>
string(1) "-"
[1]=>
string(2) "-h"
}
]]>
</screen>
</informalexample>
<para>
Unix システムでは、PHP をシェルスクリプトとして使用する他の手段があります。
最初の行が <literal>#!/usr/bin/php</literal>
(必要に応じて、PHP &cli; バイナリのパスを置き換えてください)
で始まり、PHP の開始/終了タグの中に通常の
PHP コードが続くスクリプトを書き、適当なファイル
実行属性を設定する(例: <command>chmod +x test</command>)ことが可能です。
この方法は、通常のシェル/Perl スクリプトと同様に実行することができます。
</para>
<example>
<title>シェルスクリプトとしての PHP スクリプトの実行</title>
<programlisting role="php">
<![CDATA[
#!/usr/bin/php
<?php
var_dump($argv);
?>
]]>
</programlisting>
<para>
このファイルの名前が <filename>test</filename> で、カレントディレクトリに
あるとすると、以下のように実行することができます。
</para>
<screen>
<![CDATA[
$ chmod +x test
$ ./test -h -- foo
array(4) {
[0]=>
string(6) "./test"
[1]=>
string(2) "-h"
[2]=>
string(2) "--"
[3]=>
string(3) "foo"
}
]]>
</screen>
</example>
<para>
見て分かるように、<literal>-</literal> で始まるスクリプトのパラメータを
指定する際に、特に注意する必要はありません。
</para>
<para>
PHP 実行バイナリは、Web サーバーから完全に独立して PHP スクリプトを
実行するために使用することができます。Unix システムを使用している場合、
実行可能とするためには PHP スクリプトの先頭に特別な一行を追加する必要が
あります。これにより、システムがそのスクリプトを実行するプログラムを
知ることができます。
Windows 環境では、<literal>.php</literal> ファイルのダブルクリック
オプションに <filename>php.exe</filename> を関連づけることができます。
または、PHP によりスクリプトを実行するバッチファイルを作成することも
可能です。Unix 上で動作させるためにスクリプトに追加された先頭行は、
Windows 環境での動作に悪影響を与えません。このため、この手法により、
クロスプラットフォーム環境で動作するプログラムを書くことができます。
コマンドライン PHP プログラムの書方の簡単な例を以下に示します。
</para>
<para>
<example>
<title>コマンドラインから実行されることを意図したスクリプト(script.php)</title>
<programlisting role="php">
<![CDATA[
#!/usr/bin/php
<?php
if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>
これは、ひとつのオプションをとるコマンドラインの PHP スクリプトです。
使用法:
<?php echo $argv[0]; ?> <option>
<option> は出力したい単語です。
--help, -help, -h, あるいは -? を指定すると、
このヘルプが表示されます。
<?php
} else {
echo $argv[1];
}
?>
]]>
</programlisting>
</example>
</para>
<para>
上のスクリプトでは、特殊な先頭行が用いられており、このファイルが
PHP により実行されることを示しています。ここでは &cli; 版を使用しているため、
<acronym>HTTP</acronym> ヘッダは出力されません。PHP で
コマンドラインアプリケーションを使用する際には、2 つの変数
<varname>$argc</varname> および <varname>$argv</varname> を使用することが
できます。
最初の変数は、引数の数に 1 (実行中のスクリプトの名前)を加えたものです。
2 番目の変数は、引数を保持する配列で、スクリプト名を有する
要素 0 (<varname>$argv[0]</varname>) から始まっています。
</para>
<para>
上のプログラムでは、引数が 1 より少ないかまたは多いかを調べています。
また、引数が <option>--help</option>, <option>-help</option>,
<option>-h</option> または <option>-?</option> の場合、
ヘルプメッセージを出力し、動的にスクリプト名を出力します。
他の引数を受け取った場合、これを出力します。
</para>
<para>
上のスクリプトを Unix で実行する場合、実行可能とした後、
<command>script.php echothis</command> または
<command>script.php -h</command> とする必要があります。
Windows では、この処理を行なう以下のようなバッチファイルを作成することができます。
</para>
<para>
<example>
<title>コマンドライン PHP スクリプトを実行するバッチファイル(script.bat)</title>
<programlisting role="winbat">
<![CDATA[
@echo OFF
"C:\php\php.exe" script.php %*
]]>
</programlisting>
</example>
</para>
<para>
上のプログラムが <filename>script.php</filename> という名前であるとし、
<filename>c:\php\php.exe</filename>&cli; <filename>php.exe</filename>
があるとすると、このバッチファイルは、追加オプション
<command>script.bat echothis</command> または
<command>script.bat -h</command>
を指定して、スクリプトを実行します。
</para>
<para>
PHP のコマンドラインアプリケーションを拡張するために使用できるその他の関数については、
拡張モジュール
<link linkend="ref.readline">Readline</link> に関するドキュメントも参照ください。
</para>
<para>
Windows 環境で使用している場合、PHP の設定によって
<filename>C:\php\php.exe</filename> や拡張子 <literal>.php</literal>
の指定を不要にすることもできます。<link linkend="install.windows.commandline">Micosoft
Windows コマンドラインでの PHP</link> を参照ください。
</para>
<note>
<para>
Windows では、実際に存在するユーザーアカウントの権限で PHP を実行することを推奨します。
"アカウント名とセキュリティID の間のマッピングは実行されませんでした。" というエラーのため、
ネットワークサービス経由で実行する特定の操作は失敗する場合があります
</para>
</note>
</section>
<!--}}}-->
<!--I/O Streams: {{{-->
<section xml:id="features.commandline.io-streams">
<title>入出力ストリーム</title>
<titleabbrev>I/O ストリーム</titleabbrev>
<para>
&cli.sapi; には入出力ストリーム用の定数がいくつか定義されており、
これらを使うとコマンドライン用のプログラミングが多少簡単になります。
</para>
<para>
<table>
<title>CLI 固有の定数</title>
<tgroup cols="2">
<thead>
<row>
<entry>定数</entry>
<entry>説明</entry>
</row>
</thead>
<tbody>
<row>
<entry><constant>STDIN</constant></entry>
<entry>
<para><literal>stdin</literal> へのオープン済みのストリーム。
これにより、以下のようにオープンする必要がなくなります。
<programlisting role="php">
<![CDATA[
<?php
$stdin = fopen('php://stdin', 'r');
?>
]]>
</programlisting>
<literal>stdin</literal> から1行読み込みたい場合、以下のようにします。
<programlisting role="php">
<![CDATA[
<?php
$line = trim(fgets(STDIN)); // STDIN から 1 行読み込む
fscanf(STDIN, "%d\n", $number); // STDIN から数値を読み込む
?>
]]>
</programlisting>
</para></entry>
</row>
<row>
<entry><constant>STDOUT</constant></entry>
<entry><para>
<literal>stdout</literal> へのオープン済みのストリーム。
これにより、以下のようにオープンする必要がなくなります。
<programlisting role="php">
<![CDATA[
<?php
$stdout = fopen('php://stdout', 'w');
?>
]]>
</programlisting>
</para></entry>
</row>
<row>
<entry><constant>STDERR</constant></entry>
<entry>
<para>
<literal>stderr</literal> へのオープン済みのストリーム。
これにより、以下のようにオープンする必要がなくなります。
<programlisting role="php">
<![CDATA[
<?php
$stderr = fopen('php://stderr', 'w');
?>
]]>
</programlisting>
</para>
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<para>
上記のように、<literal>stderr</literal> のようなストリームを自分で
オープンする必要はなく、以下のようにストリームリソースの代わりに
定数を使用するだけでかまいません。
<programlisting role="shell">
<![CDATA[
php -r 'fwrite(STDERR, "stderr\n");'
]]>
</programlisting>
これらのストリームを明示的に閉じる必要はありません。これは、
PHP により自動的に行われます。
</para>
<note>
<para>
これらの定数は、PHP スクリプトを
<literal>stdin</literal> から読み込んだ場合は使用できません。
</para>
</note>
</section>
<!--}}}-->
<!--Interactive shell: {{{-->
<section xml:id="features.commandline.interactive">
<title>対話シェル</title>
<para>
<option
role="configure">--with-readline</option> オプションつきで
PHP をコンパイルした場合に &cli.sapi; で対話シェルが使えるようになりました。
対話シェルは、<option>-a</option> オプションで使うことができます。
PHP 7.1.0 以降では、<link
linkend="book.readline">readline 拡張モジュール</link> が有効であれば
対話シェルは Windows 上でも使用可能です。
</para>
<para>
対話シェルを使うと、PHP のコードを打ち込んで直接実行できるようになります。
</para>
<example>
<title>対話シェル上でのコードの実行</title>
<programlisting role="shell">
<![CDATA[
$ php -a
Interactive shell
php > echo 5+8;
13
php > function addTwo($n)
php > {
php { return $n + 2;
php { }
php > var_dump(addtwo(2));
int(4)
php >
]]>
</programlisting>
</example>
<para>
対話シェル上では、タブ補完機能を使って
関数や定数、クラス名、変数名、static メソッドの呼び出し、
そしてクラス定数を補完することができます。
</para>
<example>
<title>タブ補完</title>
<simpara>
補完候補が複数あるときにタブキーを二度押すと、
補完候補の一覧が表示されます。
</simpara>
<programlisting role="shell">
<![CDATA[
php > strp[TAB][TAB]
strpbrk strpos strptime
php > strp
]]>
</programlisting>
<simpara>
候補がひとつしかないときは、タブキーを一度押せば残りを補完してくれます。
</simpara>
<programlisting role="shell">
<![CDATA[
php > strpt[TAB]ime(
]]>
</programlisting>
<simpara>
対話シェルのセッション上で定義したものについても補完することができます。
</simpara>
<programlisting role="shell">
<![CDATA[
php > $fooThisIsAReallyLongVariableName = 42;
php > $foo[TAB]ThisIsAReallyLongVariableName
]]>
</programlisting>
</example>
<simpara>
対話シェル上では操作履歴が保存され、上矢印キーと下矢印キーで履歴にアクセスすることができます。
履歴の保存先は <filename>~/.php_history</filename> ファイルです。
PHP 8.4.0 以降では、環境変数 <envar>PHP_HISTFILE</envar> を使って
履歴ファイルのパスを設定できます。
</simpara>
<para>
&cli.sapi; では、二つの
&php.ini; 設定が使えます。<parameter>cli.pager</parameter>
<parameter>cli.prompt</parameter> です。<parameter>cli.pager</parameter>
は、外部のプログラム (<filename>less</filename> など)
を出力のページャとして指定することができます。
出力が画面に直接送られるかわりに、このページャに送られるようになります。
<parameter>cli.prompt</parameter> を指定すると、
<literal>php &gt;</literal> プロンプトを変更することができます。
</para>
<para>
また、対話シェルの中では、
&php.ini; 項目を設定する際に短縮記法が使えます。
</para>
<example>
<title>対話シェル内での &php.ini; の設定</title>
<simpara>
<parameter>cli.prompt</parameter> を設定します。
</simpara>
<programlisting role="shell">
<![CDATA[
php > #cli.prompt=hello world :>
hello world :>
]]>
</programlisting>
<simpara>
バッククォートを使うと、PHP のコードの実行結果をプロンプトとして用いることができます。
</simpara>
<programlisting role="shell">
<![CDATA[
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 >
]]>
</programlisting>
<simpara>
ページャを <filename>less</filename> に設定します。
</simpara>
<programlisting role="shell">
<![CDATA[
php > #cli.pager=less
php > phpinfo();
(出力が less に送られます)
php >
]]>
</programlisting>
</example>
<para>
<parameter>cli.prompt</parameter> の設定は、次のようなエスケープシーケンスに対応しています。
<table>
<title><parameter>cli.prompt</parameter> のエスケープシーケンス</title>
<tgroup cols="2">
<thead>
<row>
<entry>シーケンス</entry>
<entry>説明</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>\e</literal></entry>
<entry>
プロンプトに色をつけます。たとえば
<literal>\e[032m\v \e[031m\b \e[34m\> \e[0m</literal>
のように使います。
</entry>
</row>
<row>
<entry><literal>\v</literal></entry>
<entry>PHP のバージョン。</entry>
</row>
<row>
<entry><literal>\b</literal></entry>
<entry>
PHP が今どのブロックにいるのかを示します。たとえば、
複数行コメントの中にいる場合は <literal>/*</literal> となります。
外側のスコープは <literal>php</literal> で表します。
</entry>
</row>
<row>
<entry><literal>\&gt;</literal></entry>
<entry>
プロンプト文字を示します。デフォルトでは
<literal>&gt;</literal> ですが、ブロックや文字列の途中にあるときは変わります。
<literal>' " {
( &gt;</literal> のような文字になることがあります。
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<note>
<para>
<link
linkend="ini.auto-prepend-file">auto_prepend_file</link> および <link
linkend="ini.auto-append-file">auto_append_file</link>
インクルードされたファイルはこのモードでもパースされますが、
いくつかの制限があります。例えば、関数はそれがコールされる前に
定義されていなければなりません。
</para>
</note>
<section xml:id="features.commandline.interactive.mode">
<title>インタラクティブモード</title>
<para>
PHP 8.1.0 より前のバージョンでは、readline 拡張モジュールが利用できない場合に、
&cli.sapi;<option>-a</option>
オプション付きで呼び出すとインタラクティブモードになっていました。
このモードでは、
完全な PHP スクリプトを標準入力(STDIN)から与えなければいけません。
スクリプトを入力後、
<keycombo action='simul'>
<keycap>CTRL</keycap>
<keycap>D</keycap>
</keycombo>
(POSIXの場合) や
<keycombo action='simul'>
<keycap>CTRL</keycap>
<keycap>Z</keycap>
</keycombo>
の後に <keycap>ENTER</keycap> (Windows)
を続けると、その PHP スクリプトが評価されていました。
&cli.sapi;<option>-a</option>
なしで呼び出しても基本的に同じ動きをします。
</para>
<para>
PHP 8.1.0 以降では、
readline 拡張モジュールが利用できない場合、
&cli.sapi;<option>-a</option>
オプションを付けた呼び出しは失敗します。
</para>
</section>
</section>
<!--}}}-->
<!--Built-in CLI Web Server: {{{-->
<section xml:id="features.commandline.webserver">
<title>ビルトインウェブサーバー</title>
<warning>
<para>
このウェブサーバーは、アプリケーション開発の支援用として設計されたものです。
テスト用に使ったり、制約のある環境でアプリケーションをデモするために使ったりすることもできるでしょう。
あらゆる機能を兼ね備えたウェブサーバーを目指したものではないので、
公開ネットワーク上で使ってはいけません。
</para>
</warning>
<para>
&cli.sapi; にはウェブサーバーの機能が組み込まれています。
</para>
<para>
このウェブサーバーは単一のシングルスレッドプロセスしか実行しないので、
リクエストがブロックされると、PHP アプリケーションはストールします。
</para>
<para>
URI リクエストの処理は、PHP を開始した時点の作業ディレクトリから行われます。
-t オプションを使えば、ドキュメントルートを明示的に指定することができます。
URI リクエストにファイルが含まれない場合は、指定したディレクトリにある index.php
あるいは index.html を返します。どちらも存在しない場合は、
親ディレクトリにさかのぼって index.php と index.html を探します。
どちらか一方が見つかるか、あるいはドキュメントルートに達するまでこれが続きます。
index.php あるいは index.html が見つかるとそれを返し、
$_SERVER['PATH_INFO'] が URI の末尾にセットされます。
見つからなかった場合はレスポンスコード 404 を返します。
</para>
<para>
ウェブサーバーの開始時にコマンドラインで PHP ファイルを指定すると、
そのファイルをウェブサーバーの "ルーター" スクリプトとして使います。
このスクリプトは、各 HTTP リクエストの開始時に動きます。このスクリプトが
&false; を返すと、リクエストされたリソースをそのままの形式で返します。
それ以外の場合はスクリプトの出力をブラウザに返します。
</para>
<para>
以下にあげる拡張子のファイルについては、標準の MIME タイプを返します:
<simplelist type="inline">
<member><literal>.3gp</literal></member>
<member><literal>.apk</literal></member>
<member><literal>.avi</literal></member>
<member><literal>.bmp</literal></member>
<member><literal>.css</literal></member>
<member><literal>.csv</literal></member>
<member><literal>.doc</literal></member>
<member><literal>.docx</literal></member>
<member><literal>.flac</literal></member>
<member><literal>.gif</literal></member>
<member><literal>.gz</literal></member>
<member><literal>.gzip</literal></member>
<member><literal>.htm</literal></member>
<member><literal>.html</literal></member>
<member><literal>.ics</literal></member>
<member><literal>.jpe</literal></member>
<member><literal>.jpeg</literal></member>
<member><literal>.jpg</literal></member>
<member><literal>.js</literal></member>
<member><literal>.kml</literal></member>
<member><literal>.kmz</literal></member>
<member><literal>.m4a</literal></member>
<member><literal>.mov</literal></member>
<member><literal>.mp3</literal></member>
<member><literal>.mp4</literal></member>
<member><literal>.mpeg</literal></member>
<member><literal>.mpg</literal></member>
<member><literal>.odp</literal></member>
<member><literal>.ods</literal></member>
<member><literal>.odt</literal></member>
<member><literal>.oga</literal></member>
<member><literal>.ogg</literal></member>
<member><literal>.ogv</literal></member>
<member><literal>.pdf</literal></member>
<member><literal>.png</literal></member>
<member><literal>.pps</literal></member>
<member><literal>.pptx</literal></member>
<member><literal>.qt</literal></member>
<member><literal>.svg</literal></member>
<member><literal>.swf</literal></member>
<member><literal>.tar</literal></member>
<member><literal>.text</literal></member>
<member><literal>.tif</literal></member>
<member><literal>.txt</literal></member>
<member><literal>.wav</literal></member>
<member><literal>.webm</literal></member>
<member><literal>.wmv</literal></member>
<member><literal>.xls</literal></member>
<member><literal>.xlsx</literal></member>
<member><literal>.xml</literal></member>
<member><literal>.xsl</literal></member>
<member><literal>.xsd</literal></member>
<member><literal>.zip</literal></member>
</simplelist>
</para>
<simpara>
PHP 7.4.0 以降では、ビルトインウェブサーバーに対して複数のリクエストを並列で投げる必要があるテストコードのために、
複数のワーカーをフォークさせるよう設定できるようになりました。
サーバーを起動する前に欲しいワーカーの数を <envar>PHP_CLI_SERVER_WORKERS</envar> 環境変数に設定してください。
</simpara>
<note>
<simpara>この機能は Windows ではサポートされていません。</simpara>
</note>
<note>
<simpara>
PHP のコマンドラインの使い方やオプションについては、
<command>php --help</command> または <command>man php</command> を実行してください。
すべてのオプションがウェブサーバーの実行時に適用されるわけではありません。
</simpara>
</note>
<warning>
<para>
この機能は <emphasis>実験的なもの</emphasis> であり、
本番環境で使うことを意図した機能では <emphasis>ありません</emphasis>
ビルトインウェブサーバーは本番環境で使うものでは<emphasis>ありません</emphasis>
</para>
</warning>
<example>
<title>ウェブサーバーの起動</title>
<programlisting role="shell">
<![CDATA[
$ cd ~/public_html
$ php -S localhost:8000
]]>
</programlisting>
<para>
ターミナルには次のように表示されます。
</para>
<screen>
<![CDATA[
PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011
Listening on localhost:8000
Document root is /home/me/public_html
Press Ctrl-C to quit
]]>
</screen>
<para>
http://localhost:8000/ と
http://localhost:8000/myscript.html をリクエストした後のターミナルの表示は、
このようになります。
</para>
<screen>
<![CDATA[
PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011
Listening on localhost:8000
Document root is /home/me/public_html
Press Ctrl-C to quit.
[Thu Jul 21 10:48:48 2011] ::1:39144 GET /favicon.ico - Request read
[Thu Jul 21 10:48:50 2011] ::1:39146 GET / - Request read
[Thu Jul 21 10:48:50 2011] ::1:39147 GET /favicon.ico - Request read
[Thu Jul 21 10:48:52 2011] ::1:39148 GET /myscript.html - Request read
[Thu Jul 21 10:48:52 2011] ::1:39149 GET /favicon.ico - Request read
]]>
</screen>
<para>
Windows 環境、かつ PHP 7.4.0 より前のバージョンでは、
ルーティングを行うスクリプトがシンボリックリンク先の静的なリソースを処理しない限り、
それらのリソースにアクセスできませんでした。
</para>
</example>
<example>
<title>ドキュメントルートディレクトリを指定した起動</title>
<programlisting role="shell">
<![CDATA[
$ cd ~/public_html
$ php -S localhost:8000 -t foo/
]]>
</programlisting>
<para>
ターミナルには次のように表示されます。
</para>
<screen>
<![CDATA[
PHP 5.4.0 Development Server started at Thu Jul 21 10:50:26 2011
Listening on localhost:8000
Document root is /home/me/public_html/foo
Press Ctrl-C to quit
]]>
</screen>
</example>
<example>
<title>ルータースクリプトの使用</title>
<para>
この例では、画像ファイルをリクエストすればそのまま表示し、HTML ファイルをリクエストすると "Welcome to PHP" と表示します。
</para>
<programlisting role="php">
<![CDATA[
<?php
// router.php
if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) {
return false; // リクエストされたリソースをそのままの形式で扱います。
} else {
echo "<p>Welcome to PHP</p>";
}
?>]]>
</programlisting>
<programlisting role="shell">
<![CDATA[
$ php -S localhost:8000 router.php
]]>
</programlisting>
</example>
<example>
<title>CLI ウェブサーバーを使っているかどうかのチェック</title>
<para>
フレームワークのルータースクリプトを、開発中は CLI ウェブサーバーで使って
その後は本番環境のウェブサーバーでも使うという例です。
</para>
<programlisting role="php">
<![CDATA[
<?php
// router.php
if (php_sapi_name() == 'cli-server') {
/* 静的コンテンツのルーティングをして false を返します */
}
/* 通常の index.php の処理を続きます */
?>]]>
</programlisting>
<programlisting role="shell">
<![CDATA[
$ php -S localhost:8000 router.php
]]>
</programlisting>
</example>
<example>
<title>未サポートのファイル形式の処理</title>
<para>
CLI ウェブサーバーで対応していない MIME タイプの静的リソースを扱うには、このようにします。
</para>
<programlisting role="php">
<![CDATA[
<?php
// router.php
$path = pathinfo($_SERVER["SCRIPT_FILENAME"]);
if ($path["extension"] == "el") {
header("Content-Type: text/x-script.elisp");
readfile($_SERVER["SCRIPT_FILENAME"]);
}
else {
return FALSE;
}
?>]]>
</programlisting>
<programlisting role="shell">
<![CDATA[
$ php -S localhost:8000 router.php
]]>
</programlisting>
</example>
<example>
<title>CLI ウェブサーバーへのリモートマシンからのアクセス</title>
<para>
ウェブサーバーを、任意のインターフェイスからポート 8000 でアクセスできるようにするには、このようにします。
</para>
<programlisting role="shell">
<![CDATA[
$ php -S 0.0.0.0:8000
]]>
</programlisting>
<warning>
<para>
ビルトインウェブサーバーは、公開ネットワークで使うべきではありません。
</para>
</warning>
</example>
</section>
<!--}}}-->
<section xml:id="features.commandline.ini">
<title>INI 設定</title>
<para>
<table>
<title>CLI SAPI の設定オプション</title>
<tgroup cols="4">
<thead>
<row>
<entry>&Name;</entry>
<entry>&Default;</entry>
<entry>&Changeable;</entry>
<entry>&Changelog;</entry>
</row>
</thead>
<tbody xml:id="features.commandline.ini.list">
<row>
<entry><link linkend="ini.cli-server.color">cli_server.color</link></entry>
<entry>"0"</entry>
<entry><constant>INI_ALL</constant></entry>
<entry></entry>
</row>
</tbody>
</tgroup>
</table>
</para>
&ini.descriptions.title;
<para>
<variablelist>
<varlistentry xml:id="ini.cli-server.color">
<term>
<parameter>cli_server.color</parameter>
<type>bool</type>
</term>
<listitem>
<para>
組み込みの開発用ウェブサーバーで、ANSI カラーコードを使ってターミナルに出力できるようにします。
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</section>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=marker fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->