<?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.differences.php',
    1 => '他の SAPI との違い',
    2 => '他の SAPI との違い',
  ),
  'up' => 
  array (
    0 => 'features.commandline.php',
    1 => 'コマンドラインの使用法',
  ),
  'prev' => 
  array (
    0 => 'features.commandline.php',
    1 => 'コマンドラインの使用法',
  ),
  'next' => 
  array (
    0 => 'features.commandline.options.php',
    1 => 'オプション',
  ),
  '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.differences" class="section">
  <h2 class="title">他の <abbr title="Server Application Programming Interface">SAPI</abbr> との違い</h2>
  
  <p class="para">
   <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> を他の <abbr title="Server Application Programming Interface">SAPI</abbr> と比べた時の
   大きな違いを以下に示します。
   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      <abbr title="Common Gateway Interface">CGI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> と異なり、ヘッダが出力されません。
     </p>
     <p class="para">
      <abbr title="Common Gateway Interface">CGI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> は HTTP ヘッダの出力を抑制する機能を
      提供していますが、等価な機能は <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> ではサポートされていません。
     </p>
     <p class="para">
      デフォルトでは <abbr title="Command Line Interpreter/Interface">CLI</abbr> は静寂モードで起動されます。古い <abbr title="Common Gateway Interface">CGI</abbr> スクリプトと互換性を
      保って使えるように <strong class="option unknown">-q</strong> および <strong class="option unknown">--no-header</strong> スイッチが残されています。
     </p>
     <p class="para">
      作業ディレクトリをスクリプトの場所に変更しません
      (<strong class="option unknown">-C</strong> および <strong class="option unknown">--no-chdir</strong> スイッチは
      互換性のために残されています)。
     </p>
     <p class="para">
      エラーメッセージはプレーンテキスト (<abbr title="Hyper Text Markup Language">HTML</abbr> フォーマットはしない)
      で表示されます。
     </p>
    </li>
    
    <li class="listitem">
     <p class="para">
      以下に示すいくつかの <var class="filename">php.ini</var> ディレクティブは、<abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr>
      により上書きされます。これは、シェル環境では意味がないためです。
     </p>
     <p class="para">
      <table class="doctable table">
       <caption><strong>上書きされる <var class="filename">php.ini</var> のディレクティブ</strong></caption>
       
        <thead>
         <tr>
          <th>ディレクティブ</th>
          <th><abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> のデフォルト値</th>
          <th>コメント</th>
         </tr>

        </thead>

        <tbody class="tbody">
         <tr>
          <td><a href="errorfunc.configuration.php#ini.html-errors" class="link">html_errors</a></td>
          <td><strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong></td>
          <td>
           エラーメッセージに含まれる <abbr title="Hyper Text Markup Language">HTML</abbr> タグは
           シェル上では意味がなく、可読性をかなり低下させるため、この
           ディレクティブはデフォルトで <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> となっています。
          </td>
         </tr>

         <tr>
          <td><a href="outcontrol.configuration.php#ini.implicit-flush" class="link">implicit_flush</a></td>
          <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
          <td>
           シェル環境では、
           <span class="function"><a href="function.print.php" class="function">print</a></span>, <span class="function"><a href="function.echo.php" class="function">echo</a></span> および
           関連するものによる全ての出力は、直ちに出力され、バッファに
           保持されないことが望ましいと言えます。この場合でも、
           標準出力を保留または操作したい場合には、
           <a href="ref.outcontrol.php" class="link">出力バッファリング</a>
           を使用することが可能です。
          </td>
         </tr>

         <tr>
          <td><a href="info.configuration.php#ini.max-execution-time" class="link">max_execution_time</a></td>
          <td>0 (無制限)</td>
          <td>
           シェル環境では、PHP を際限なく使用できる
           ようにするために、最大実行時間の制限は無しに設定されています。
           Web 用アプリケーションは数秒単位で実行されるよう作られて
           いますが、シェルアプリケーションの実行時間は、これよりかなり
           長くなる傾向があります。
          </td>
         </tr>

         <tr>
          <td><a href="ini.core.php#ini.register-argc-argv" class="link">register_argc_argv</a></td>
          <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
          <td>
          <p class="para">
           この設定が <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> なので、<abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> では常に
           <em>argc</em> (アプリケーションに渡した引数の数)
           および <em>argv</em> (実際の引数の配列)
           を使うことができます。
          </p>
          <p class="para">
           <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> を使用するときに
           PHP の <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> 変数が登録され、適切な値がセットされます。
           あるいは <var class="varname"><a href="reserved.variables.server.php" class="classname">$_SERVER</a></var> や
           <var class="varname"><a href="reserved.variables.server.php" class="classname">$_SERVER['argv']</a></var> を使うこともできます。
          </p>
          <div class="warning"><strong class="warning">警告</strong>
           <p class="para">
            <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv</a></var> や <var class="varname"><a href="reserved.variables.server.php" class="classname">$_SERVER['argv']</a></var>
            が存在することは、PHPスクリプトがコマンドラインから実行されていることを示す信頼できる根拠にはなりません。
            なぜなら、<a href="ini.core.php#ini.register-argc-argv" class="link">register_argc_argv</a>
            が有効になっている場合に、他のコンテキストで設定されている可能性があるからです。
            コマンドラインから実行されていることを確認するには、代わりに <span class="function"><a href="function.php-sapi-name.php" class="function">php_sapi_name()</a></span> の返り値をチェックすべきです。
            <div class="informalexample">
             <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">php_sapi_name</span><span style="color: #007700">() === </span><span style="color: #DD0000">'cli'</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">"This is being run from the command line!\n"</span><span style="color: #007700">;<br />}</span></span></code></div>
             </div>

            </div>
           </p>
          </div>
          </td>
         </tr>

         <tr>
          <td><a href="outcontrol.configuration.php#ini.output-buffering" class="link">output_buffering</a></td>
          <td><strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong></td>
          <td>
           <p class="para">
            <var class="filename">php.ini</var> で <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> とハードコードされていても、
            <a href="book.outcontrol.php" class="link">出力バッファリング</a>
            関数は使用可能です。
           </p>
          </td>
         </tr>

         <tr>
          <td><a href="info.configuration.php#ini.max-input-time" class="link">max_input_time</a></td>
          <td><strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong></td>
          <td>
           <p class="para">
            PHP <abbr title="Command Line Interpreter/Interface">CLI</abbr> は GET、POST あるいはファイルのアップロードをサポートしません。
           </p>
          </td>
         </tr>

        </tbody>
       
      </table>

     </p>
     <blockquote class="note"><p><strong class="note">注意</strong>: 
      <p class="para">
       これらのディレクティブは、設定ファイル <var class="filename">php.ini</var> またはカスタム
       設定ファイル(指定した場合のみ)で他の値に初期化できません。
       この制限は、これらのデフォルト値が全ての設定ファイルをパースした後に
       適用されるためです。しかし、これらの値は実行時に変更することが
       可能です
       (上記のディレクティブの全てについてこれが当てはまるわけでは
       ありません。例えば、<a href="ini.core.php#ini.register-argc-argv" class="link">register_argc_argv</a>)。
      </p>
     </p></blockquote>
     <blockquote class="note"><p><strong class="note">注意</strong>: 
      <p class="para">
       コマンドラインのスクリプトでは
       <a href="misc.configuration.php#ini.ignore-user-abort" class="link">ignore_user_abort</a>
       を設定することを推奨します。詳細は <span class="function"><a href="function.ignore-user-abort.php" class="function">ignore_user_abort()</a></span>
       を参照ください。
      </p>
     </p></blockquote>
    </li>
    
    <li class="listitem">
     <p class="para">
      シェル環境での利便性を考慮して、
      <a href="features.commandline.io-streams.php" class="link">I/O ストリーム
      </a> 用に多くの定数が定義されています。
     </p>
    </li>
    
    <li class="listitem">
     <p class="para">
      <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> は、カレントディレクトリをスクリプトのディレクトリに変更
      <strong>しません</strong>!
     </p>
     <div class="example" id="example-1">
      <p><strong>例1 
       <abbr title="Common Gateway Interface">CGI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> との違いを示す例
      </strong></p>
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// test.php という名前のシンプルなテストアプリケーション<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">getcwd</span><span style="color: #007700">(), </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      <div class="example-contents"><p>
       <abbr title="Common Gateway Interface">CGI</abbr> 版を使った場合、出力は以下のようになります。
      </p></div>
      <div class="example-contents screen">
<div class="cdata"><pre>
$ pwd
/tmp

$ php -q another_directory/test.php
/tmp/another_directory
</pre></div>
      </div>
      <div class="example-contents"><p>
       これは、PHP がカレントディレクトリを
       スクリプトのディレクトリに変更することを明らかに示しています。
      </p></div>
      <div class="example-contents"><p>
       <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> を使った場合はこのようになります。
      </p></div>
      <div class="example-contents screen">
<div class="cdata"><pre>
$ pwd
/tmp

$ php -f another_directory/test.php
/tmp
</pre></div>
      </div>
      <div class="example-contents"><p>
       これにより、PHP でシェルツールを書く際の柔軟性をより大きくすることができます。
      </p></div>
     </div>
     <blockquote class="note"><p><strong class="note">注意</strong>: 
      <p class="para">
       <abbr title="Common Gateway Interface">CGI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> は、この <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr>
       の動作をコマンドライン実行時のスイッチ <code class="literal">-C</code>
       によりサポートしています。
      </p>
     </p></blockquote>
    </li>
   </ul>
  </p>
 </div><?php manual_footer($setup); ?>