<?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.usage.php',
    1 => 'Использование',
    2 => 'Выполнение PHP-файлов',
  ),
  'up' => 
  array (
    0 => 'features.commandline.php',
    1 => 'Работа с PHP из командной строки',
  ),
  'prev' => 
  array (
    0 => 'features.commandline.options.php',
    1 => 'Опции',
  ),
  'next' => 
  array (
    0 => 'features.commandline.io-streams.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.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">
      Указание конкретного файла для запуска.
     </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>. Нет ограничений, какой
      файл запускать; в частности, файлам даже не требуется
      содержать расширение <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>. Первый индекс —
   ноль — содержит название скрипта, который вызвали из командной строки.
   Учтите, что если код вызывается из командной
   строки на лету с опцией <strong class="option unknown">-r</strong>, значением
   элемента <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv[0]</a></var> будет <code class="literal">«Стандартный поток»</code> (Standard input code);
   до PHP 7.2.0 это был дефис (<code class="literal">&quot;-&quot;</code>). То же самое верно и для кода,
   переданного через конвейер из <strong><code><a href="reserved.constants.php#constant.stdin">STDIN</a></code></strong>.
  </p>

  <p class="para">
   Вторая зарегистрированная глобальная переменная —
   <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>,
   а <strong>не</strong> количество аргументов,
   которые передали скрипту.
  </p>

  <p class="para">
   В режиме командной строки PHP поддерживает передачу аргументов скрипту без символа <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-скриптов из консоли. В первой строке такого скрипта
   указывают шебанг #! (от англ. hashbang) и корректный путь
   к бинарному файлу PHP <abbr title="Command Line Interpreter/Interface">CLI</abbr>: <code class="literal">#!/usr/bin/php</code>.
   После этой строки записывают стандартный 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-файл может использоваться для запуска PHP-скриптов
   независимо от веб-сервера. В случае работы в Unix-подобной системе,
   необходимо добавить в первую строку файла <code class="literal">#!</code> (называемый также &quot;shebang&quot;)
   чтобы указать, какая из программ должна запускать скрипт.
   На Windows-платформах можно назначить обработчик <var class="filename">php.exe</var> для файлов
   с расширениями <code class="literal">.php</code> или создать пакетный
   (.bat) файл для запуска скриптов посредством PHP.
   Строка, добавляемая в начале скрипта для Unix-систем,
   не влияет на их работу в ОС Windows, таким образом можно
   создавать кросс-платформенные скрипты. Ниже приведён простой
   пример скрипта, который выполняется из командной строки:
  </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>-заголовка.
  </p>

  <p class="para">
   Скрипт сначала проверяет наличие обязательного одного аргумента (в дополнение к
   имени скрипта, который также подсчитывается). Если их нет, или если переданный
   аргумент был <strong class="option unknown">--help</strong>, <strong class="option unknown">-help</strong>,
   <strong class="option unknown">-h</strong> или <strong class="option unknown">-?</strong>, выводится
   справочное сообщение с использованием <var class="varname"><a href="reserved.variables.argv.php" class="classname">$argv[0]</a></var>, которое содержит
   имя выполняемого скрипта. В противном случае просто выводится полученный аргумент.
  </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>, а полный путь к <abbr title="Command Line Interpreter/Interface">CLI</abbr>
   <var class="filename">php.exe</var> находится в
   <var class="filename">C:\php\php.exe</var>, этот пакетный файл
   запустит его с переданными параметрами:
   <strong class="command">script.bat echothis</strong> или
   <strong class="command">script.bat -h</strong>.
  </p>

  <p class="para">
   Также можно ознакомиться с модулем
   <a href="ref.readline.php" class="link">Readline</a> для получения
   дополнительных функций, которые можно использовать для улучшения
   консольного PHP-скрипта.
  </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">Запуск PHP из
    командной строки в Microsoft Windows</a>.
  </p>

  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    В Windows рекомендуется запускать PHP под актуальной учётной записью пользователя.
    При работе в сетевой службе отдельные операции не выполняются,
    поскольку «сопоставление имён учётных записей и идентификаторов безопасности не выполнено».
   </p>
  </p></blockquote>
 </div><?php manual_footer($setup); ?>