Php переменная командной строки
Примечание: эти директивы не могут быть инициализированы другим значением из файла конфигурации php.ini или специального файла (если специфицирован). Это является некоторым ограничением, поскольку эти значения по умолчанию применяются после разбора всех файлов конфигурации. Однако их значение может быть изменено на этапе прогона программы (что не имеет смысла для всех других директив, например, для register_argc_argv).
Таблица 24-2. Специфические CLI-константы
Имея всё это, вы не должны, например, самостоятельно открывать поток для stderr , а просто используете константу вместо ресурса потока:
php -r 'fwrite(STDERR, "stderr\n");' $ pwd /tmp $ php-cgi -f another_directory/test.php /tmp/another_directory |
$ pwd /tmp $ php -f another_directory/test.php /tmp
Список опций командной строки исполняемого файла PHP может быть получен в любое время путём запуска PHP с ключом -h : Usage/Использование: php [options] [-f] [args. ] php [options] -r [args. ] php [options] [-- args. ] -s Отображает исходный текст с разными цветами. -w Отображает исходный текст без комментариев и пробелов. -f Разбирает . -v Номер версии. -c | Ищет файл php.ini в данной директории. -a Запустить интерактивно. -d foo[=bar] Определить INI-вхождение foo со значением 'bar'. -e Генерировать расширенную информацию для отладчика/profiler'а. -z Загрузить Zend-расширения. -l Только проверить синтаксис (lint). -m Показать скомпилированные модули. -i PHP-информация. -r Запустить PHP без использования тэгов скрипта -h Данный help. args. Аргументы, передаваемые скрипту. Используйте -- args когда первый аргумент начинается с - или скрипт читается из stdin php my_script.php php -f my_script.php php -r 'print_r(get_defined_constants());'
$ some_application | some_filter | php | sort -u >final_output.txt Вы не можете комбинировать эти три способа при выполнении кода. Как и в любом приложении оболочки, не только сам PHP , но и ваши скрипты PHP также принимают аргументы. Количество передаваемых в скрипт аргументов в РНР не ограничивается (оболочка имеет ограничение на количество передаваемых символов). Если аргументы, которые вы хотите передать в скрипт, не начинаются с символа дефиса (-) , ничего специально наблюдать не надо. Передача в скрипт аргумента, начинающегося с — , создаст проблемы, поскольку 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" > Однако, вот другой способ использования PHP для скриптинга оболочки. Вы можете написать скрипт, первая строка которого начинается с #!/usr/bin/php , а затем идёт нормальный PHP -код, содержащийся между начальным и конечным тэгами PHP , и соответствующим образом устанавливаются атрибуты выполнения файла. Таким способом он может быть исполнен как нормальный скрипт оболочки или perl: Приняв, что файл называется test и находится в текущей директории, мы можем выполнить: $ chmod 755 test $ ./test -h -- foo array(4) < [0]=>string(6) "./test" [1]=> string(2) "-h" [2]=> string(2) "--" [3]=> string(3) "foo" > Как вы видите, ничего особо не нужно делать при передаче параметров в скрипт, который начинается с — . Таблица 24-3. Опции командной строкиОтображать синтаксис в цвете. Эта опция использует внутренний механизм разбора файла, производит его расцвеченную HTML -версию и записывает её в стандартный вывод. Заметьте, что генерируется лишь блок
Отобразить исходный текст без комментариев и пробелов.
Разбирает и выполняет данный файл. Этот переключатель является необязательным и может быть опущен. Достаточно предоставить имя файла для выполнения. Записывает PHP, PHP SAPI и Zend-версии в стандартный вывод, например: $ php -v PHP 4.3.0-dev (cli), Copyright (c) 1997-2002 The PHP Group Zend Engine v1.2.1, Copyright (c) 1998-2002 Zend Technologies С помощью этой опции можно либо специфицировать директорию для поиска php.ini , либо специальную директорию INI -файла (который не обязательно называется php.ini ), например: $ php -c /custom/directory/ my_script.php $ php -c /custom/directory/custom-file.ini my_script.php Запускает PHP интерактивно. Эта опция позволяет устанавливать специальное значение для каждой директивы конфигурации, которые допускаются в php.ini . Синтаксис таков: -d configuration_directive[=value] # Опущение части value установит данную директиву конфигурации в "1" $ php -d max_execution_time -r ' $foo = ini_get("max_execution_time"); var_dump($foo);' string(1) "1" # Передача пустой части value установит данную директиву конфигурации в "" php -d max_execution_time= -r ' $foo = ini_get("max_execution_time"); var_dump($foo);'string(0) "" # В директиву конфигурации будет установлено то, что # передано после символа '=' $ php -d max_execution_time=20 -r ' $foo = ini_get("max_execution_time"); var_dump($foo);' string(2) "20" $ php -d max_execution_time=doesntmakesense -r ' $foo = ini_get("max_execution_time"); var_dump($foo);' string(15) "doesntmakesense" Генерирует расширенную информацию для debugger/profiler. Загружает Zend-расширение. Если задано только имя файла, PHP пытается загрузить данное расширение из текущего пути по умолчанию к библиотеке в вашей системе (обычно специфицируется как /etc/ld.so.conf в Linux-системах). Передача filename с абсолютным путём не будет использовать системный путь поиска библиотеки. Относительное filename с информацией директории скажет PHP — попытаться загрузить расширение относительно текущей директории. Эта опция предоставляет удобный способ выполнения проверки синтаксиса данного PHP -кода. В случае успеха — текст No syntax errors detected in записывается в стандартный вывод, а return-код оболочки будет 0 . При неудаче — текст Errors parsing вместе с внутренним сообщением разборщика об ошибке записывается в стандартный вывод, а return-код оболочки будет 255 . Эта опция не будет находить фатальные ошибки (вроде не определённых функций). Используйте -f , если хотите проверить также и наличие фатальных ошибок.
Используя эту опцию, PHP печатает на выводе встроенные (и загруженные) модули PHP и Zend: $ php -m [PHP Modules] xml tokenizer standard session posix pcre overload mysql mbstring ctype [Zend Modules] |
Эта опция позволяет выполнять PHP прямо в командной строке. Начальный и конечный тэги PHP ( ) не нужны и вызывают ошибки разборщика.
Примечание: нужно проявлять внимание при использовании этой формы PHP , чтобы не было противоречий с заменой переменных командной строки, выполняемой оболочкой.
Пример, выводящий ошибку разборщика:
$ php -r "$foo = get_defined_constants();" Command line code(1) : Parse error - parse error, unexpected '='
Проблема здесь в том, что sh/bash выполняет замену переменной даже при использовании двойных кавычек » . Поскольку переменная $foo вряд ли определена, она ни во что не разворачивается, что в результате даёт код, передаваемый в PHP для выполнения, фактически прочитанный:
$ php -r " = get_defined_constants();" |
Корректным будет использовать одинарные кавычки ‘ . Переменные в строках, заключённые в одинарные кавычки, не разворачиваются при работе sh/bash.
$ php -r '$foo = get_defined_constants(); var_dump($foo);' array(370) < ["E_ERROR"]=>int(1) ["E_WARNING"]=> int(2) ["E_PARSE"]=> int(4) ["E_NOTICE"]=> int(8) ["E_CORE_ERROR"]=> [. ] |
Если вы используете оболочку/shell иначе, чем sh/bash, у вас могут появиться новые вопросы. Отправляйте bug report или mail по адресу phpdoc@lists.php.net. Можно легко столкнуться с проблемами при попытке получить переменные оболочки в коде или использовании обратных слэшей (/) для замен/escaping.
Вы предупреждены.
Исполняемый файл PHP может быть использован для запуска PHP-скриптов абсолютно независимо от web-сервера.
Если вы работаете под Unix, вы должны добавлять специальную первую строчку в ваши PHP-скрипты и делать их исполняемыми, чтобы система знала, какая программа должна выполнять эти скрипты.
Под Windows вы можете ассоциировать php.exe с опцией двойного щелчка по файлам .php либо сделать batch-файл (.bat) для запуска скрипта через PHP. Строка, добавленная в начало скрипта для работы под Unix, не помешает под Windows, поэтому вы можете писать таким образом межплатформенные программы. Ниже дан пример простой РНР-программы для выполнения из командной строки.
Пример 24-1. Скрипт, предназначенный для запуска из командной строки (script.php)
#!/usr/bin/php This is a command line PHP script with one option. Usage: can be some word you would like to print out. With the --help, -help, -h, or -? options, you can get this help. else < echo $argv[1]; >?>
Здесь мы используем специальную первую строку для указания на то, что этот файл должен быть запущен в PHP. Мы работаем с CLI-версией, поэтому не выполняется вывод HTTP-шапок/header. Имеются две переменные, которые вы можете использовать при написании РНР-приложений для командной строки: $argc и $argv . Первая — это количество аргументов плюс 1 (имя запущенного скрипта). Вторая — это массив аргументов, начиная с имени скрипта с индексом ноль ( $argv[0] ).
Мы проверяем, имеется ли менее или более одного аргумента. Также, если аргумент был —help , -help , -h или -? , мы печатаем help-сообщение, выводя имя скрипта динамически. Если мы получили какой-либо другой аргумент, мы выводим его (echo).
Если вы хотите выполнить вышеприведённый скрипт под Unix, вам необходимо сделать его executable и просто вызвать как script.php echothis или script.php -h . Под Windows вы можете создать batch-файл для выполнения этой задачи:
Пример 24-2. Пакетный/Batch-файл для запуска PHP-скрипта в командной строке (script.bat)
@c:\php\php.exe script.php %1 %2 %3 %4
Приняв, что вы назвали программу script.php и что ваш php.exe находится в c:\php\php.exe , этот batch-файл запустит её с добавленными вами опциями: script.bat echothis или script.bat -h .
См. также в документации по расширению Readline о функциях, которые можно использовать для усовершенствования вашего РНР-приложения для командной строки.
| ||||||
|