## Выполнение PHP-файлов

В CLI SAPI есть три различных способа запуска PHP-кода:

1. Указание конкретного файла для запуска.

       $ php my_script.php

       $ php -f my_script.php

   Оба способа — с опцией -f или без — запустят файл my_script.php. Нет ограничений, какой файл запускать; в частности, файлам даже не требуется содержать расширение `.php`.

2. Передача PHP-кода для выполнения в командной строке.

       $ php -r 'print_r(get_defined_constants());'

   При работе в этом режиме соблюдают осторожность из-за риска подстановки значений переменных оболочки в переменные в двойных кавычках.

   > Замечание:

   > Внимательно прочтите пример: код не содержит открывающих и закрывающих тегов! Опции -r теги не требуются, и даже вызовут ошибку разбора.

3. Передать запускаемый PHP-код через стандартный поток ввода (`stdin`).

   Это даёт мощную возможность создавать PHP-код и передавать его запускаемому файлу, как показано в этом (вымышленном) примере:

       $ some_application | some_filter | php | sort -u > final_output.txt

Вы не можете комбинировать любой из этих трёх способов запуска кода.

Как и любое другое консольное приложение бинарный файл PHP принимает аргументы, но PHP-скрипт также получает аргументы. PHP не ограничивает количество аргументов, передаваемых в скрипт (оболочка консоли устанавливает некоторый порог количества символов, которые могут передать; обычно этого лимита хватает). Переданные аргументы доступны в глобальном массиве $argv. Первый индекс — ноль — содержит название скрипта, который вызвали из командной строки. Учтите, что если код вызывается из командной строки на лету с опцией -r, значением элемента $argv[0] будет `«Стандартный поток»` (Standard input code); до PHP 7.2.0 это был дефис (`"-"`). То же самое верно и для кода, переданного через конвейер из `STDIN`.

Вторая зарегистрированная глобальная переменная — $argc, которая содержит количество элементов в массиве $argv, а не количество аргументов, которые передали скрипту.

В режиме командной строки PHP поддерживает передачу аргументов скрипту без символа `-`. При передаче в скрипт аргумента, перед которым указали символ `-`, возникнет ошибка, поскольку PHP-интерпретатор попытается обработать аргумент до выполнения скрипта как параметр команды. Аргументы скрипта указывают после разделителя списка аргументов `--`, чтобы не возникали ошибки интерпретации команды. После разбора разделителя PHP-интерпретатором следующие аргументы передаются в скрипт нетронутыми.

    # Команда не запустит код, а выведет информацию о параметрах командной строки, которые поддерживает PHP
    $ php -r 'var_dump($argv);' -h
    Usage: php [options] [-f] <file> [args...]
    [...]

    # Команда передаст аргумент '-h' в скрипт вместо вывода справки по параметрам PHP
    $ php -r 'var_dump($argv);' -- -h
    array(2) {
      [0]=>
      string(1) "-"
      [1]=>
      string(2) "-h"
    }

При этом в Unix-системах доступен ещё один способ запуска PHP-скриптов из консоли. В первой строке такого скрипта указывают шебанг #! (от англ. hashbang) и корректный путь к бинарному файлу PHP CLI: `#!/usr/bin/php`. После этой строки записывают стандартный PHP-код, обрамлённый открывающим и закрывающим PHP-тегами. Сразу после установки корректных атрибутов запуска на файл, например chmod +x test), скрипт станет готов к запуску как стандартный консольный или perl-скрипт:

Пример #1 Запуск PHP-скрипта как консольного

    #!/usr/bin/php
    <?php
    var_dump($argv);
    ?>

Предполагая, что этот файл назван test и находится в текущей директории, можно сделать следующее:

    $ chmod +x test
    $ ./test -h -- foo
    array(4) {
      [0]=>
      string(6) "./test"
      [1]=>
      string(2) "-h"
      [2]=>
      string(2) "--"
      [3]=>
      string(3) "foo"
    }

Как можно увидеть, в этом случае не нужно заботиться о передаче параметров, которые начинаются с `-`.

Исполняемый PHP-файл может использоваться для запуска PHP-скриптов независимо от веб-сервера. В случае работы в Unix-подобной системе, необходимо добавить в первую строку файла `#!` (называемый также "shebang") чтобы указать, какая из программ должна запускать скрипт. На Windows-платформах можно назначить обработчик php.exe для файлов с расширениями `.php` или создать пакетный (.bat) файл для запуска скриптов посредством PHP. Строка, добавляемая в начале скрипта для Unix-систем, не влияет на их работу в ОС Windows, таким образом можно создавать кросс-платформенные скрипты. Ниже приведён простой пример скрипта, который выполняется из командной строки:

Пример #2 Скрипт для запуска из командной строки (script.php)

    #!/usr/bin/php
    <?php

    if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
    ?>

    Это консольный PHP-скрипт, принимающий один аргумент.

      Использование:
      <?php echo $argv[0]; ?> <option>

      <option> Любое слово, которое вы хотели бы
      напечатать. Опции  --help, -help, -h,
      или -? покажут текущую справочную информацию.

    <?php
    } else {
        echo $argv[1];
    }
    ?>

В приведённом скрипте первая строка содержит шебанг, который указывает, что файл запускается PHP. Работа ведётся с CLI-версией, поэтому не будет выведено ни одного HTTP-заголовка.

Скрипт сначала проверяет наличие обязательного одного аргумента (в дополнение к имени скрипта, который также подсчитывается). Если их нет, или если переданный аргумент был --help, -help, -h или -?, выводится справочное сообщение с использованием $argv[0], которое содержит имя выполняемого скрипта. В противном случае просто выводится полученный аргумент.

Для запуска приведённого примера в Unix-системе, нужно сделать его исполняемым и просто выполнить в консоли script.php echothis или script.php -h. В Windows-системе можно создать пакетный файл:

Пример #3 Пакетный файл для запуска PHP-скрипта из командной строки (script.bat)

    @echo OFF
    "C:\php\php.exe" script.php %*

Предполагая, что вышеприведённый скрипт называется script.php, а полный путь к CLI php.exe находится в C:\php\php.exe, этот пакетный файл запустит его с переданными параметрами: script.bat echothis или script.bat -h.

Также можно ознакомиться с модулем Readline для получения дополнительных функций, которые можно использовать для улучшения консольного PHP-скрипта.

В Windows запуск PHP можно настроить без необходимости указывать C:\php\php.exe или расширение `.php`. Подробнее эта тема описана в разделе Запуск PHP из командной строки в Microsoft Windows.

> Замечание:

> В Windows рекомендуется запускать PHP под актуальной учётной записью пользователя. При работе в сетевой службе отдельные операции не выполняются, поскольку «сопоставление имён учётных записей и идентификаторов безопасности не выполнено».

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open