В CLI SAPI есть три различных способа запуска PHP-кода:
Указание конкретного файла для запуска.
$ php my_script.php $ php -f my_script.php
Оба способа — с опцией -f или без — запустят
файл my_script.php. Нет ограничений, какой
файл запускать; в частности, файлам даже не требуется
содержать расширение .php.
Передача PHP-кода для выполнения в командной строке.
$ php -r 'print_r(get_defined_constants());'
При работе в этом режиме соблюдают осторожность из-за риска подстановки значений переменных оболочки в переменные в двойных кавычках.
Замечание:
Внимательно прочтите пример: код не содержит открывающих и закрывающих тегов! Опции -r теги не требуются, и даже вызовут ошибку разбора.
Передать запускаемый 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 под актуальной учётной записью пользователя. При работе в сетевой службе отдельные операции не выполняются, поскольку «сопоставление имён учётных записей и идентификаторов безопасности не выполнено».