Поиск…


Обработка аргументов

Аргументы передаются программе аналогично большинству языков 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 станет массивом.
  • Обязательные параметры аргумента (один двоеточие) принимают одно пространство или пробел (например, необязательные параметры аргумента) в качестве разделителя
  • После того, как один аргумент, который не может быть отображен в какие-либо параметры, параметры не будут отображаться.


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow