<?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 => 'zh',
  ),
  'this' => 
  array (
    0 => 'features.commandline.differences.php',
    1 => '和其它 SAPI 模块的区别',
    2 => '和其它 SAPI 模块的区别',
  ),
  'up' => 
  array (
    0 => 'features.commandline.php',
    1 => 'PHP 的命令行模式',
  ),
  'prev' => 
  array (
    0 => 'features.commandline.php',
    1 => 'PHP 的命令行模式',
  ),
  'next' => 
  array (
    0 => 'features.commandline.options.php',
    1 => '选项',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'zh',
    '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> 中并不存在类似的方法以开启 HTTP 头信息的输出。
    </p>
    <p class="para">
     <abbr title="Command Line Interpreter/Interface">CLI</abbr> 默认以安静模式开始，但为了保证兼容性，<strong class="option unknown">-q</strong> 和
     <strong class="option unknown">--no-header</strong> 参数为了向后兼容仍然保留，使得可以使用旧的 <abbr title="Common Gateway Interface">CGI</abbr> 脚本。
    </p>
    <p class="para">
     在运行时，不会把工作目录改为脚本的当前目录（可以使用
     <strong class="option unknown">-C</strong> 和 <strong class="option unknown">--no-chdir</strong> 参数来兼容 CGI 模式）。
    </p>
    <p class="para">
     出错时输出纯文本的错误信息（非 <abbr title="Hyper Text Markup Language">HTML</abbr> 格式）。
    </p>
   </li>

   <li class="listitem">
    <p class="para">
     <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> 强制覆盖了 <var class="filename">php.ini</var>
     中的某些设置，因为这些设置在外壳环境下是没有意义的。
    </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>
          在命令行模式下，所有来自 <a href="function.print.php" class="link"><code class="literal">print</code></a> 和
          <a href="function.echo.php" class="link"><code class="literal">echo</code></a> 的输出将被立即写到输出端，而不作任何地缓冲操作。如果希望延缓或控制标准输出，仍然可以使用
          <a href="ref.outcontrol.php" class="link">output buffering</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 变量
          <code class="literal">$argc</code> 和 <code class="literal">$argv</code>
          已被注册并且设定了对应的值。随时可以通过
          <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>
            的存在并不能表明脚本一定正在从命令行运行，因为当启用 <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>
    <p class="para">
     以下范例显示了本模块与 <abbr title="Common Gateway Interface">CGI</abbr>
     <abbr title="Server Application Programming Interface">SAPI</abbr> 模块之间的不同：
     <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>

    </p>
    <p class="para">
     在使用 <code class="literal">CGI</code> 版本时，其输出为
     <div class="example-contents screen">
<div class="cdata"><pre>
$ pwd
/tmp

$ php-cgi -f another_directory/test.php
/tmp/another_directory
</pre></div>
     </div>
    </p>
    <p class="para">
     明显可以看到 PHP 将当前目录改成了刚刚运行过的脚本所在的目录。
    </p>
    <p class="para">
     使用 <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> 模式，得到：
     <div class="example-contents screen">
<div class="cdata"><pre>
$ pwd
/tmp

$ php -q another_directory/test.php
/tmp
</pre></div>
     </div>
     这使得在利用 PHP 编写外壳工具时获得了很大的便利。
    </p>
    <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> 加上
      <strong class="option unknown">-C</strong> 参数，使其支持 <abbr title="Command Line Interpreter/Interface">CLI</abbr> <abbr title="Server Application Programming Interface">SAPI</abbr> 的功能。
     </p>
    </p></blockquote>
   </li>
  </ul>
 </p>
</div><?php manual_footer($setup); ?>