Php получить командную строку

$argc

Contains the number of arguments passed to the current script when running from the command line.

Note: The script’s filename is always passed as an argument to the script, therefore the minimum value of $argc is 1 .

Note: This variable is not available when register_argc_argv is disabled.

Examples

Example #1 $argc example

When executing the example with: php script.php arg1 arg2 arg3

The above example will output something similar to:

Notes

See Also

User Contributed Notes 4 notes

To find out are you in CLI or not, this is much better in my opinion:
if ( PHP_SAPI != «cli» ) exit;
>
?>

Note: when using CLI $argc (as well as $argv) are always available, regardless of register_argc_argv, as explained at http://docs.php.net/manual/en/features.commandline.php

To decide whether my script is run from CLI I simply create a PHP script that handles only CLI invocations.

// Set environment variables your application depends on
$_SERVER [ ‘HTTP_HOST’ ] = ‘domain.tld’ ;
// $_SERVER[ ‘REQUEST_URI’ ] = ‘/some/URI/if/needed’;

// Use the environment to read out required values
$task = $_SERVER [ ‘argv’ ][ 1 ];

// Instanciate the dispatcher or whatever you use
$dispatcher = new Dispatcher ();
$dispatcher -> handle ( $task );

?>

This way my application doesn’t have to know about CLI at all.

int main(int argc, char *argv[])
fprintf(stdout,»argumen count : %d\n»,argc);
fprintf(stdout,»argumen vector : %s\n»,argv);
return 0;
>

Источник

Принимаем аргументы из командной строки

Принимаем аргументы из командной строки

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

Функции argv и argc#

Самое простейшее что мы начнём писать будет выглядеть примерно так:

// Ожидаем что скрипт будет вызываться с такими параметрами: // php backup.php dbuser dbpassword database host  if ($argc != 5)   die(PHP_EOL . 'Use: php backup.php dbuser dbpassword database host' . PHP_EOL); >  $dbuser = $argv[1]; $dbpassword = $argv[2]; $database = $argv[3]; $host = $argv[4];  $mysql = mysql_connect($host, $dbuser, $dbpassword); mysql_select_db($database, $mysql); // . 

Тут мы использовали системную переменную argс для получения количества всех параметров. Запомните, что нулевой параметр (имя скрипта) тут тоже учитывается.

И системную переменную argv с массивом всех параметров.

Для простейшего скрипта этого хватит, но что если мы захотим поддерживать и отдать этот скрипт другим разработчикам?

Скорее всего будет куча ругани в нашу сторону, потому что очень легко можно ошибиться и перепутать местами пароль и базу данных и заметить ошибку будет крайне сложно. Посмотрите:

php backup.php dbuser database dbpassword host 

Разбираем параметры с функцией getopt#

Вот тут нам на помощь приходит крайне удобная функция разбора параметров: getopt

Основная мощь getopt в том, что она позволяет нам использовать флаги, обязательные и необязательные параметры в произвольном порядке.

Давайте напишем простой, но очень выразительный пример использования getopt, а потом, посмотрите как люди раньше мучались с регулярками, что бы разобрать командную строку 🙂

// Тут показаны две формы записи аргументов: короткая и полная // При этом, если после параметра стоит два двоеточия, значит параметр необязательный, // а если одно двоеточие - значит обязательный. // все параметры которые не указаны в конфигурации будут проигнорированы  $params = array(  '' => 'help',  'h::' => 'host::',  'u:' => 'user:',  'p::' => 'password::',  'd:' => 'database:', );  // Default values  $host = 'localhost'; $user = 'root'; $password = null; $database = ''; $errors = array();  $options = getopt( implode('', array_keys($params)), $params );  if (isset($options['host']) || isset($options['h']))   $host = isset( $options['host'] ) ? $options['host'] : $options['h']; >  if (isset($options['user']) || isset($options['u']))   $port = isset( $options['user'] ) ? $options['user'] : $options['u']; > else   $errors[] = 'user required'; >  if (isset($options['password']) || isset($options['p']))   $socket = isset( $options['password'] ) ? $options['password'] : $options['p']; >  if (isset($options['database']) || isset($options['d']))   $database = isset( $options['database'] ) ? $options['database'] : $options['d']; > else   $errors[] = 'database required'; >  if ( isset($options['help']) || count($errors) )   $help = " usage: php backup.php [--help] [-h|--host=127.0.0.1] [-u|--user=root] [-p|--password=secret] [-d|--database]  Options:  --help Show this message  -h --host Server hostname (default: localhost)  -u --user User  -p --password Password (default: no password)  -d --database Database Example:  php backup.php --user=root --password=secret --database=blog ";  if ( $errors )    $help .= 'Errors:' . PHP_EOL . implode("\n", $errors) . PHP_EOL;  >  die($help); >  $mysql = mysql_connect($host, $user, $password); mysql_select_db($database, $mysql);  // . 

Теперь запустим наш скрипт с параметром –help и порадуемся что хорошо поддерживаемую и понятную программу так легко написать

Если вкратце, то getopt принимает все аргументы из командной строки и складывает валидные параметры в массив $options. А из уже получившегося массива мы можем получить все аргументы и в зависимости от них выдать результат.

Давайте ещё добавим последний штрих, который должен быть во всех наших скриптах:

  1. Можно убрать расширение php
  2. В начало каждого скрипта добавим опцию для интерпритатора #!/usr/bin/env php
  3. Сделаем наши скрипты исполняемыми chmod +x backup.php

После этого можно пользоваться получившимся скриптом как настоящей юникс-программой:

./backup --user=ukko --password=password --database=db1 

Источник

Php получить командную строку

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

$ php my_script.php $ php -f my_script.php
$ php -r 'print_r(get_defined_constants());'

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

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

$ 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 -r 'var_dump($argv);' -h Usage: php [options] [-f] [args. ] [. ] # Эта команда передаст аргумент '-h' в скрипт, предотвратив показ справки PHP $ php -r 'var_dump($argv);' -- -h array(2) < [0]=>string(1) "-" [1]=> string(2) "-h" >

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

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

Предполагая, что этот файл назван 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)

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

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

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

В приведённом выше скрипте в первой строке содержится shebang, указывающий что этот файл должен запускаться 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 под актуальной учётной записью пользователя. При работе в сетевой службе некоторые операции не будут выполнены, поскольку «сопоставление имён учётных записей и идентификаторов безопасности не выполнено».

User Contributed Notes 7 notes

On Linux, the shebang (#!) line is parsed by the kernel into at most two parts.
For example:

1: #!/usr/bin/php
2: #!/usr/bin/env php
3: #!/usr/bin/php -n
4: #!/usr/bin/php -ddisplay_errors=E_ALL
5: #!/usr/bin/php -n -ddisplay_errors=E_ALL

1. is the standard way to start a script. (compare «#!/bin/bash».)

2. uses «env» to find where PHP is installed: it might be elsewhere in the $PATH, such as /usr/local/bin.

3. if you don’t need to use env, you can pass ONE parameter here. For example, to ignore the system’s PHP.ini, and go with the defaults, use «-n». (See «man php».)

4. or, you can set exactly one configuration variable. I recommend this one, because display_errors actually takes effect if it is set here. Otherwise, the only place you can enable it is system-wide in php.ini. If you try to use ini_set() in your script itself, it’s too late: if your script has a parse error, it will silently die.

5. This will not (as of 2013) work on Linux. It acts as if the whole string, «-n -ddisplay_errors=E_ALL» were a single argument. But in BSD, the shebang line can take more than 2 arguments, and so it may work as intended.

Summary: use (2) for maximum portability, and (4) for maximum debugging.

Источник

Читайте также:  File modes in cpp
Оцените статью