$argv
Содержит массив ( array ) всех аргументов, переданных скрипту при запуске из командной строки.
Замечание: Первый аргумент $argv[0] всегда содержит имя файла запущенного скрипта.
Замечание: Эта переменная недоступна, если register_argc_argv отключён.
Примеры
Пример #1 Пример использования $argv
Запустим пример в командной строке: php script.php arg1 arg2 arg3
Результатом выполнения данного примера будет что-то подобное:
array(4) < [0]=>string(10) "script.php" [1]=> string(4) "arg1" [2]=> string(4) "arg2" [3]=> string(4) "arg3" >
Примечания
Смотрите также
User Contributed Notes 6 notes
Please note that, $argv and $argc need to be declared global, while trying to access within a class method.
class A
public static function b ()
var_dump ( $argv );
var_dump (isset( $argv ));
>
>
A :: b ();
?>
will output NULL bool(false) with a notice of «Undefined variable . «
whereas global $argv fixes that.
To use $_GET so you dont need to support both if it could be used from command line and from web browser.
foreach ($argv as $arg) $e=explode(» note» >
You can reinitialize the argument variables for web applications.
So if you created a command line, with some additional tweaks you can make it work on the web.
If you come from a shell scripting background, you might expect to find this topic under the heading «positional parameters».
Sometimes $argv can be null, such as when «register-argc-argv» is set to false. In some cases I’ve found the variable is populated correctly when running «php-cli» instead of just «php» from the command line (or cron).
I discovered that `register_argc_argv` is alway OFF if you use php internal webserver, even if it is set to `On` in the php.ini.
What means there seems to be no way to access argv / argc in php internal commandline server.
Принимаем аргументы из командной строки
Вот как обычно бывает: Нам нужно написать малюсенький консольный скрипт бекапа, который, может запускаться из крона, и при этом скрипт должен принимать параметры для соединения с базой данных.
Функции 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. А из уже получившегося массива мы можем получить все аргументы и в зависимости от них выдать результат.
Давайте ещё добавим последний штрих, который должен быть во всех наших скриптах:
- Можно убрать расширение php
- В начало каждого скрипта добавим опцию для интерпритатора #!/usr/bin/env php
- Сделаем наши скрипты исполняемыми chmod +x backup.php
После этого можно пользоваться получившимся скриптом как настоящей юникс-программой:
./backup --user=ukko --password=password --database=db1
$argc
Содержит количество аргументов, переданных текущему скрипту при запуске из командной строки.
Замечание: Имя файла скрипта всегда передаётся в качестве первого аргумента, таким образом минимальное значение $argc равно 1 .
Замечание: Эта переменная недоступна, если register_argc_argv отключён.
Примеры
Пример #1 Пример использования $argc
Запустим пример в командной строке: php script.php arg1 arg2 arg3
Результатом выполнения данного примера будет что-то подобное:
Примечания
Смотрите также
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;
>