<?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 => 'ru',
  ),
  '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' => 'ru',
    '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> по умолчанию запускается в тихом режиме, тем не менее,
      ключи <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>
      сохранили для обратной совместимости.
     </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>
           Значение по умолчанию равно <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>, поскольку в консоли неудобно читать
           сообщения об ошибке с нагромождением неинтерпретируемых <abbr title="Hyper Text Markup Language">HTML</abbr>-тегов.
          </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 часто выполняют расширенный,
           по сравнению со стандартными веб-скриптами, диапазон задач,
           и поскольку консольные скрипты часто выполняются долго,
           для директивы устанавливается значение 0 — бесконечное время выполнения скрипта.
          </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>
            переменные <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>
            не относятся к надёжному признаку запуска скрипта
            из командной строки, поскольку при включённой директиве <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">"Код запускается из командной строки!\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">потоков ввода-вывода</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 /><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">;</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">
       При запуске из командной строки с ключом <strong class="option unknown">-C</strong>
       <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>.
      </p>
     </p></blockquote>
    </li>
   </ul>
  </p>
 </div><?php manual_footer($setup); ?>