PHP
Интерфейс командной строки (CLI)
Поиск…
Обработка аргументов
Аргументы передаются программе аналогично большинству языков C-стиля. $argc
- целое число, содержащее количество аргументов, включая имя программы, а $argv
- массив, содержащий аргументы для программы. Первый элемент $argv
- это имя программы.
#!/usr/bin/php
printf("You called the program %s with %d arguments\n", $argv[0], $argc - 1);
unset($argv[0]);
foreach ($argv as $i => $arg) {
printf("Argument %d is %s\n", $i, $arg);
}
Вызов вышеуказанного приложения с php example.php foo bar
(где example.php содержит указанный выше код) приведет к следующему выводу:
Вы вызвали программу example.php с двумя аргументами
Аргумент 1 является foo
Аргумент 2 является баром
Обратите внимание, что $argc
и $argv
- это глобальные переменные, а не суперглобальные переменные. Они должны быть импортированы в локальную область с использованием ключевого слова global
если они необходимы в функции.
Этот пример показывает , как аргументы сгруппированы , когда ускользает , такие как ""
или \
используется.
Пример скрипта
var_dump($argc, $argv);
Командная строка
$ php argc.argv.php --this-is-an-option three\ words\ together or "in one quote" but\ multiple\ spaces\ counted\ as\ one
int(6)
array(6) {
[0]=>
string(13) "argc.argv.php"
[1]=>
string(19) "--this-is-an-option"
[2]=>
string(20) "three words together"
[3]=>
string(2) "or"
[4]=>
string(12) "in one quote"
[5]=>
string(34) "but multiple spaces counted as one"
}
Если PHP-скрипт запускается с использованием -r
:
$ php -r 'var_dump($argv);'
array(1) {
[0]=>
string(1) "-"
}
Или код, отправленный в STDIN из php
:
$ echo '<?php var_dump($argv);' | php
array(1) {
[0]=>
string(1) "-"
}
Обработка входных и выходных данных
При запуске из CLI задаются константы STDIN , STDOUT и STDERR . Эти константы являются файловыми дескрипторами и могут считаться эквивалентными результатам выполнения следующих команд:
STDIN = fopen("php://stdin", "r");
STDOUT = fopen("php://stdout", "w");
STDERR = fopen("php://stderr", "w");
Константы могут использоваться везде, где стандартный дескриптор файла:
#!/usr/bin/php
while ($line = fgets(STDIN)) {
$line = strtolower(trim($line));
switch ($line) {
case "bad":
fprintf(STDERR, "%s is bad" . PHP_EOL, $line);
break;
case "quit":
exit;
default:
fprintf(STDOUT, "%s is good" . PHP_EOL, $line);
break;
}
}
Построенные потоковые адреса, на которые ссылаются ранее ( php://stdin
, php://stdout
и php://stderr
), могут использоваться вместо имен файлов в большинстве контекстов:
file_put_contents('php://stdout', 'This is stdout content');
file_put_contents('php://stderr', 'This is stderr content');
// Open handle and write multiple times.
$stdout = fopen('php://stdout', 'w');
fwrite($stdout, 'Hello world from stdout' . PHP_EOL);
fwrite($stdout, 'Hello again');
fclose($stdout);
В качестве альтернативы вы также можете использовать readline () для ввода, а также вы можете использовать эхо- печать или любые другие функции печати строк для вывода.
$name = readline("Please enter your name:");
print "Hello, {$name}.";
Коды возврата
Конструкцию exit можно использовать для передачи кода возврата в среду выполнения.
#!/usr/bin/php
if ($argv[1] === "bad") {
exit(1);
} else {
exit(0);
}
По умолчанию код возврата 0
будет возвращен, если ни один не указан, т. exit
совпадает с exit(0)
. Поскольку exit
не является функцией, скобки не требуются, если код возврата не передается.
Коды возврата должны быть в диапазоне от 0 до 254 (255 зарезервировано PHP и не должно использоваться). По соглашению, выход с кодом возврата 0
сообщает вызывающей программе, что скрипт PHP успешно работает. Используйте ненулевой код возврата, чтобы сообщить вызывающей программе, что произошло определенное условие ошибки.
Обработка параметров программы
Параметры программы можно обрабатывать с помощью функции getopt()
. Он работает с аналогичным синтаксисом команды POSIX getopt
с дополнительной поддержкой длинных опций в стиле GNU.
#!/usr/bin/php
// a single colon indicates the option takes a value
// a double colon indicates the value may be omitted
$shortopts = "hf:v::d";
// GNU-style long options are not required
$longopts = ["help", "version"];
$opts = getopt($shortopts, $longopts);
// options without values are assigned a value of boolean false
// you must check their existence, not their truthiness
if (isset($opts["h"]) || isset($opts["help"])) {
fprintf(STDERR, "Here is some help!\n");
exit;
}
// long options are called with two hyphens: "--version"
if (isset($opts["version"])) {
fprintf(STDERR, "%s Version 223.45" . PHP_EOL, $argv[0]);
exit;
}
// options with values can be called like "-f foo", "-ffoo", or "-f=foo"
$file = "";
if (isset($opts["f"])) {
$file = $opts["f"];
}
if (empty($file)) {
fprintf(STDERR, "We wanted a file!" . PHP_EOL);
exit(1);
}
fprintf(STDOUT, "File is %s" . PHP_EOL, $file);
// options with optional values must be called like "-v5" or "-v=5"
$verbosity = 0;
if (isset($opts["v"])) {
$verbosity = ($opts["v"] === false) ? 1 : (int)$opts["v"];
}
fprintf(STDOUT, "Verbosity is %d" . PHP_EOL, $verbosity);
// options called multiple times are passed as an array
$debug = 0;
if (isset($opts["d"])) {
$debug = is_array($opts["d"]) ? count($opts["d"]) : 1;
}
fprintf(STDOUT, "Debug is %d" . PHP_EOL, $debug);
// there is no automated way for getopt to handle unexpected options
Этот скрипт можно протестировать следующим образом:
./test.php --help
./test.php --version
./test.php -f foo -ddd
./test.php -v -d -ffoo
./test.php -v5 -f=foo
./test.php -f foo -v 5 -d
Обратите внимание, что последний метод не будет работать, потому что -v 5
недействителен.
Примечание. Начиная с PHP 5.3.0,
getopt
зависит от ОС, работает также и в Windows.
Ограничить выполнение сценария в командной строке
Функция php_sapi_name()
и константа PHP_SAPI
возвращают тип интерфейса ( S erver API ), который используется PHP. Они могут использоваться для ограничения выполнения сценария в командной строке, проверяя, является ли вывод функции равным cli
.
if (php_sapi_name() === 'cli') {
echo "Executed from command line\n";
} else {
echo "Executed from web browser\n";
}
Функция drupal_is_cli()
является примером функции, которая определяет, был ли сценарий выполнен из командной строки:
function drupal_is_cli() {
return (!isset($_SERVER['SERVER_SOFTWARE']) && (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)));
}
Запуск сценария
В Linux / UNIX или Windows скрипт может быть передан в качестве аргумента для исполняемого файла PHP, причем параметры и аргументы этого сценария следующие:
php ~/example.php foo bar
c:\php\php.exe c:\example.php foo bar
Это передает foo
и bar
качестве аргументов example.php
.
В Linux / UNIX предпочтительным способом запуска скриптов является использование shebang (например, #!/usr/bin/env php
) в качестве первой строки файла и установка исполняемого бита в файле. Предполагая, что сценарий находится на вашем пути, вы можете вызвать его напрямую:
example.php foo bar
Использование /usr/bin/env php
делает исполняемый файл PHP, используя PATH. После установки PHP он может не располагаться в одном месте (например, /usr/bin/php
или /usr/local/bin/php
), в отличие от env
который обычно доступен из /usr/bin/env
.
В Windows вы можете получить тот же результат, добавив каталог PHP и ваш скрипт в PATH и отредактировав PATHEXT, чтобы позволить .php
быть обнаруженным с помощью PATH. Другая возможность - добавить файл с именем example.bat
или example.cmd
в том же каталоге, что и ваш PHP-скрипт, и записать в него эту строку:
c:\php\php.exe "%~dp0example.php" %*
Или, если вы добавили каталог PHP в PATH, для удобства использования:
php "%~dp0example.php" %*
Поведенческие различия в командной строке
При запуске из CLI PHP демонстрирует несколько разных поведений, чем при запуске с веб-сервера. Эти различия следует учитывать, особенно в случае, когда один и тот же сценарий может запускаться из обеих сред.
- Нет изменения каталога. При запуске скрипта с веб-сервера текущий рабочий каталог всегда принадлежит самому скрипту. Код
require("./stuff.inc");
предполагает, что файл находится в том же каталоге, что и скрипт. В командной строке текущий рабочий каталог - это каталог, в котором вы находитесь, когда вы вызываете скрипт. Сценарии, которые будут вызываться из командной строки, должны всегда использовать абсолютные пути. (Обратите внимание на магические константы__DIR__
и__FILE__
продолжают работать , как и ожидалось, и вернуть расположение сценария.) - Нет буферизации вывода . Директивы
php.ini
output_buffering
иimplicit_flush
умолчаниюoutput_buffering
false
иtrue
, соответственно. Буферизация по-прежнему доступна, но должна быть явно включена, иначе вывод всегда будет отображаться в режиме реального времени. - Нет ограничений по времени . Директива
php.ini
max_execution_time
установлена в ноль, поэтому по умолчанию скрипты не будут отключены. - Нет ошибок HTML. Если вы включили директиву
php.ini
html_errors
, она будет проигнорирована в командной строке. - Можно загрузить различные
php.ini
. Когда вы используете php из cli, он может использовать разныеphp.ini
чем веб-сервер. Вы можете узнать, какой файл используется, запустивphp --ini
.
Запуск встроенного веб-сервера
Начиная с версии 5.4, PHP поставляется со встроенным сервером. Его можно использовать для запуска приложения без необходимости установки другого http-сервера, такого как nginx или apache. Встроенный сервер разработан только в среде контроллера для разработки и тестирования.
Его можно запустить с помощью команды php -S:
Чтобы протестировать его, создайте файл index.php
содержащий
<?php
echo "Hello World from built-in PHP server";
и запустить команду php -S localhost:8080
Теперь вы должны будете видеть контент в браузере. Чтобы проверить это, перейдите к http://localhost:8080
Каждый доступ должен приводить к записи в журнал, записанной на терминал
[Mon Aug 15 18:20:19 2016] ::1:52455 [200]: /
Пограничные случаи getopt ()
В этом примере показано поведение getopt
когда пользовательский ввод необычен:
getopt.php
var_dump(
getopt("ab:c::", ["delta", "epsilon:", "zeta::"])
);
Командная строка оболочки $ php getopt.php -a -a -bbeta -b beta -cgamma --delta --epsilon --zeta --zeta=f -c gamma
array(6) {
["a"]=>
array(2) {
[0]=>
bool(false)
[1]=>
bool(false)
}
["b"]=>
array(2) {
[0]=>
string(4) "beta"
[1]=>
string(4) "beta"
}
["c"]=>
array(2) {
[0]=>
string(5) "gamma"
[1]=>
bool(false)
}
["delta"]=>
bool(false)
["epsilon"]=>
string(6) "--zeta"
["zeta"]=>
string(1) "f"
}
Из этого примера видно, что:
- Отдельные опции (без двоеточия) всегда имеют логическое значение
false
если включено. - Если опция повторяется, соответствующее значение на выходе
getopt
станет массивом. - Обязательные параметры аргумента (один двоеточие) принимают одно пространство или пробел (например, необязательные параметры аргумента) в качестве разделителя
- После того, как один аргумент, который не может быть отображен в какие-либо параметры, параметры не будут отображаться.