<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/features.commandline.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'features.commandline.usage.php',
    1 => 'PHP ファイルの実行',
    2 => 'PHP ファイルの実行',
  ),
  'up' => 
  array (
    0 => 'features.commandline.php',
    1 => 'コマンドラインの使用法',
  ),
  'prev' => 
  array (
    0 => 'features.commandline.options.php',
    1 => 'オプション',
  ),
  'next' => 
  array (
    0 => 'features.commandline.io-streams.php',
    1 => 'I/O ストリーム',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'features/commandline.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="features.commandline.usage" class="section">
  <h2 class="title">PHP ファイルの実行</h2>
  
  
  <p class="para">
   <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> は、実行する PHP コードを
   取得するために三種類の異なる手段をサポートしています。
   <ol type="1">
    <li class="listitem">
     <p class="para">
      PHP に特定のファイルの実行を指示する。
     </p>
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
$ php my_script.php

$ php -f my_script.php
</pre></div>
      </div>
     </div>
     <p class="para">
      上記の方法は共に(<strong class="option unknown">-f</strong> スイッチの使用の如何に関らず)
      指定したファイル <var class="filename">my_script.php</var> を実行します。
      実行ファイルとしてあらゆるファイルを指定することができ、
      PHP スクリプトは拡張子
      <code class="literal">.php</code> で終わる必要がなく、任意の名前や拡張子を
      使用することができます。
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      実行する PHP コードをコマンドラインで直接指定する。
     </p>
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
$ php -r &#039;print_r(get_defined_constants());&#039;
</pre></div>
      </div>
     </div>
     <p class="para">
      シェル変数の置換と引用符の使用については特に注意してください。
     </p>
     <blockquote class="note"><p><strong class="note">注意</strong>: 
      <p class="para">
       この例をよくみてください。開始/終了タグがありません!
       <strong class="option unknown">-r</strong> スイッチを使用した場合、これらのタグは不要と
       なります。これらのタグを使用するとパーサーエラーを発生します。
      </p>
     </p></blockquote>
    </li>
    <li class="listitem">
     <p class="para">
      実行する PHP コードを標準入力
      (<code class="literal">stdin</code>)で指定する。
     </p>
     <p class="para">
      これは強力な機能で、以下の(仮想的な)例に示すように、動的に
      PHP コードを生成し、実行バイナリに入力すること
      ができます。
     </p>
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
$ some_application | some_filter | php | sort -u &gt; final_output.txt
</pre></div>
      </div>
     </div>
    </li>
   </ol>
   これらのコードを実行する三種類の方法を組み合わせて使用することはできません。
  </p>
  
  <p class="para">
   他のシェルアプリケーションのように、PHP バイナリに
   引数を指定することができるだけでなく、PHP スクリプトが
   この引数を取得することも可能です。スクリプトに指定できる
   引数の数は PHP による制限を受けません
   (シェルは指定可能な文字数の最大値を設定しています。通常、この制限値を
   越えることはできません)。スクリプトに指定した引数は、グローバル配列
   <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv</a></var> でアクセス可能です。
   最初のインデックス (添字 0) には常に、
   コマンドラインからコールしたスクリプト名が含まれています。
   コマンドラインスイッチ
   <strong class="option unknown">-r</strong> を使ってインラインでコードを実行した場合は、
   <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv[0]</a></var> の値は <code class="literal">&quot;Standard input code&quot;</code>
   となることに注意しましょう。
   PHP 7.2.0 より前のバージョンでは、
   ダッシュ (<code class="literal">-</code>) でした。
   <strong><code><a href="reserved.constants.php#constant.stdin">STDIN</a></code></strong>
   の内容をパイプ経由で実行した場合も同じです。
  </p>

  <p class="para">
   登録される第 2 のグローバル変数は <var class="varname"><a href="reserved.variables.argc.php" class="classname">$argc</a></var> で
   (スクリプトに指定された引数の数では<strong>なく
   </strong>)、配列 <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv</a></var> の要素数が含まれます。
  </p>
  
  <p class="para">
   スクリプトに指定する引数が文字 <code class="literal">-</code> で始まっていない
   限り、特に留意すべきことはありません。スクリプトに指定する引数が文字
   <code class="literal">-</code> で始まる場合、PHP 自体がこれを
   パースする必要があるとみなすため、問題を発生します。
   これを防止するため、引数リストセパレータ <code class="literal">--</code> を
   使用してください。PHP にパースされる引数の後に
   このセパレータを置くと、その後の全ての引数はそのままパースされずに
   スクリプトに渡されます。
  </p>
  
  <div class="informalexample">
   <div class="example-contents screen">
<div class="cdata"><pre>
# これは、指定したコードを実行せずに PHP の使用法を示します
$ php -r &#039;var_dump($argv);&#039; -h
Usage: php [options] [-f] &lt;file&gt; [args...]
[...]

# これは &#039;-h&#039; を引数として解釈し、PHP の使用法を表示しません
$ php -r &#039;var_dump($argv);&#039; -- -h
array(2) {
  [0]=&gt;
  string(1) &quot;-&quot;
  [1]=&gt;
  string(2) &quot;-h&quot;
}
</pre></div>
   </div>
  </div>
  
  <p class="para">
   Unix システムでは、PHP をシェルスクリプトとして使用する他の手段があります。
   最初の行が <code class="literal">#!/usr/bin/php</code>
   (必要に応じて、PHP <abbr title="Command Line Interpreter/Interface">CLI</abbr> バイナリのパスを置き換えてください)
   で始まり、PHP の開始/終了タグの中に通常の
   PHP コードが続くスクリプトを書き、適当なファイル
   実行属性を設定する(例: <strong class="command">chmod +x test</strong>)ことが可能です。
   この方法は、通常のシェル/Perl スクリプトと同様に実行することができます。
  </p>
  
  <div class="example" id="example-1">
   <p><strong>例1 シェルスクリプトとしての PHP スクリプトの実行</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">#!/usr/bin/php<br /><span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$argv</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>
     このファイルの名前が <var class="filename">test</var> で、カレントディレクトリに
     あるとすると、以下のように実行することができます。
   </p></div>
   <div class="example-contents screen">
<div class="cdata"><pre>
$ chmod +x test
$ ./test -h -- foo
array(4) {
  [0]=&gt;
  string(6) &quot;./test&quot;
  [1]=&gt;
  string(2) &quot;-h&quot;
  [2]=&gt;
  string(2) &quot;--&quot;
  [3]=&gt;
  string(3) &quot;foo&quot;
}
</pre></div>
   </div>
  </div>
  
  <p class="para">
   見て分かるように、<code class="literal">-</code> で始まるスクリプトのパラメータを
   指定する際に、特に注意する必要はありません。
  </p>
  
  <p class="para">
   PHP 実行バイナリは、Web サーバーから完全に独立して PHP スクリプトを
   実行するために使用することができます。Unix システムを使用している場合、
   実行可能とするためには PHP スクリプトの先頭に特別な一行を追加する必要が
   あります。これにより、システムがそのスクリプトを実行するプログラムを
   知ることができます。
   Windows 環境では、<code class="literal">.php</code> ファイルのダブルクリック
   オプションに <var class="filename">php.exe</var> を関連づけることができます。
   または、PHP によりスクリプトを実行するバッチファイルを作成することも
   可能です。Unix 上で動作させるためにスクリプトに追加された先頭行は、
   Windows 環境での動作に悪影響を与えません。このため、この手法により、
   クロスプラットフォーム環境で動作するプログラムを書くことができます。
   コマンドライン PHP プログラムの書方の簡単な例を以下に示します。
  </p>
  
  <p class="para">
   <div class="example" id="example-2">
    <p><strong>例2 コマンドラインから実行されることを意図したスクリプト(script.php)</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">#!/usr/bin/php<br /><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">$argc </span><span style="color: #007700">!= </span><span style="color: #0000BB">2 </span><span style="color: #007700">|| </span><span style="color: #0000BB">in_array</span><span style="color: #007700">(</span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">], array(</span><span style="color: #DD0000">'--help'</span><span style="color: #007700">, </span><span style="color: #DD0000">'-help'</span><span style="color: #007700">, </span><span style="color: #DD0000">'-h'</span><span style="color: #007700">, </span><span style="color: #DD0000">'-?'</span><span style="color: #007700">))) {<br /></span><span style="color: #0000BB">?&gt;<br /></span><br />これは、ひとつのオプションをとるコマンドラインの PHP スクリプトです。<br /><br />  使用法:<br />  <span style="color: #0000BB">&lt;?php </span><span style="color: #007700">echo </span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]; </span><span style="color: #0000BB">?&gt;</span> &lt;option&gt;<br /><br />  &lt;option&gt; は出力したい単語です。<br />  --help, -help, -h, あるいは -? を指定すると、<br />  このヘルプが表示されます。<br /><br /><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">} else {<br />    echo </span><span style="color: #0000BB">$argv</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">];<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
  
  <p class="para">
   上のスクリプトでは、特殊な先頭行が用いられており、このファイルが
   PHP により実行されることを示しています。ここでは <abbr title="Command Line Interpreter/Interface">CLI</abbr> 版を使用しているため、
   <abbr title="Hypertext Transfer Protocol">HTTP</abbr> ヘッダは出力されません。PHP で
   コマンドラインアプリケーションを使用する際には、2 つの変数
   <var class="varname"><a href="reserved.variables.argc.php" class="classname">$argc</a></var> および <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv</a></var> を使用することが
   できます。
   最初の変数は、引数の数に 1 (実行中のスクリプトの名前)を加えたものです。
   2 番目の変数は、引数を保持する配列で、スクリプト名を有する
   要素 0 (<var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv[0]</a></var>) から始まっています。
  </p>
  
  <p class="para">
   上のプログラムでは、引数が 1 より少ないかまたは多いかを調べています。
   また、引数が <strong class="option unknown">--help</strong>, <strong class="option unknown">-help</strong>,
   <strong class="option unknown">-h</strong> または <strong class="option unknown">-?</strong> の場合、
   ヘルプメッセージを出力し、動的にスクリプト名を出力します。
   他の引数を受け取った場合、これを出力します。
  </p>
  
  <p class="para">
   上のスクリプトを Unix で実行する場合、実行可能とした後、
   <strong class="command">script.php echothis</strong> または
   <strong class="command">script.php -h</strong> とする必要があります。
   Windows では、この処理を行なう以下のようなバッチファイルを作成することができます。
  </p>
  
  <p class="para">
   <div class="example" id="example-3">
    <p><strong>例3 コマンドライン PHP スクリプトを実行するバッチファイル(script.bat)</strong></p>
    <div class="example-contents">
<div class="winbatcode"><pre class="winbatcode">@echo OFF
&quot;C:\php\php.exe&quot; script.php %*</pre>
</div>
    </div>

   </div>
  </p>
  
  <p class="para">
   上のプログラムが <var class="filename">script.php</var> という名前であるとし、
   <var class="filename">c:\php\php.exe</var> に <abbr title="Command Line Interpreter/Interface">CLI</abbr> <var class="filename">php.exe</var>
   があるとすると、このバッチファイルは、追加オプション
   <strong class="command">script.bat echothis</strong> または
   <strong class="command">script.bat -h</strong>
   を指定して、スクリプトを実行します。
  </p>
  
  <p class="para">
   PHP のコマンドラインアプリケーションを拡張するために使用できるその他の関数については、
   拡張モジュール
   <a href="ref.readline.php" class="link">Readline</a> に関するドキュメントも参照ください。
  </p>
  
  <p class="para">
   Windows 環境で使用している場合、PHP の設定によって
   <var class="filename">C:\php\php.exe</var> や拡張子 <code class="literal">.php</code>
   の指定を不要にすることもできます。<a href="install.windows.commandline.php" class="link">Micosoft
   Windows コマンドラインでの PHP</a> を参照ください。
  </p>

  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="para">
    Windows では、実際に存在するユーザーアカウントの権限で PHP を実行することを推奨します。
    &quot;アカウント名とセキュリティID の間のマッピングは実行されませんでした。&quot; というエラーのため、
    ネットワークサービス経由で実行する特定の操作は失敗する場合があります
   </p>
  </p></blockquote>
 </div><?php manual_footer($setup); ?>