Использование PHP в командной строке (Часть 2)
Как и в любом консольном приложении, не только PHP, но и сам скрипт может принимать аргументы командной строки. Количество передаваемых аргументов в PHP не ограничено (хотя консоль имеет некоторое ограничение на количество передаваемых символов, но на практике вы не должны с этим столкнуться). Все аргументы, переданные вашему скрипту, доступны в виде глобального массива $argv. Нулевой элемент содержит имя скрипта (которое является символом - в случае, если PHP-код читается из потока stdin или указан в командной строке при помощи ключа -r). Вторая определяемая глобальная переменная $argc содержит количество элементов массива $argv (а не количество аргументов, передаваемых при запуске).
До тех пор, пока передаваемые аргументы не начинаются с символа -, ничего особенного предпринимать не надо. Но при указании аргумента, который начинается с символа -, может возникнуть проблема, так как PHP попытается обработать их самостоятельно. Чтобы предотвратить это, используйте -- в качестве разделителя списка аргументов. Все последующие за таким разделителем аргументы будут переданы вашему скрипту без изменений.
# Приведенный пример не выполнит указанный код, а выдаст справку об использовании PHP
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] <file> [args...]
[...]
# Аргумент '-h' будет передан скрипту, справка напечатана не будет
$ php -r 'var_dump($argv);' -- -h
array(2) {
[0]=>
string(1) "-"
[1]=>
string(2) "-h"
} |
Однако, существует еще один способ использования PHP для написания консольных скриптов. Вы можете написать скрипт, первая строка которого начинается с #!/usr/bin/php. Следующие строки содержат обыкновенный PHP-код, обрамленный открывающими и завершающими PHP-тегами. Также необходимо установить права на выполнение (как правило, это chmod +x test), чтобы ваш скрипт мог запускаться, как обыкновенный консольный (или perl) скрипт:
#!/usr/bin/php
<?php
var_dump($argv);
?> |
Предположив, что наш скрипт называется 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 4.3.3.
Опции, доступные из командной строки
Опция |
Полное название |
Описание |
-s |
--syntax-highlight |
Отображает исходный код с цветной подсветкой
Эта опция использует внутренний механизм разбора файла, генерирует подсвеченную HTML-версию и записывает ее в стандартный вывод. Следует заметить, что генерируется только блок <code> [...] </code> с HTML-тегами, без HTML-заголовков.
Замечание: Эта опция не совместима с опцией -r.
|
-s |
--syntax-highlighting |
Алиас для --syntax-highlight. |
-w |
--strip |
Отображает исходный текст без комментариев и пробельных символов.
Замечание: Эта опция не совместима с опцией -r.
|
-f |
--file |
Исполняет указанный файл. Опция -f является не обязательной и может отсутствовать. Достаточно просто указать имя файла. |
-v |
--version |
Выводит информацию о версии PHP, PHP SAPI и Zend, например:
$ php -v
PHP 4.3.0 (cli), Copyright (c) 1997-2002 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies |
|
-c |
--php-ini |
При помощи этой опции можно указать специфическую директорию для конфигурационного файла php.ini либо непосредственно указать на сам INI-файл (название которого может отличаться от стандартного php.ini), например:
$ php -c /custom/directory/ my_script.php
$ php -c /custom/directory/custom-file.ini my_script.php |
В случае, если вы не используете данную опцию, конфигурационный файл будет взят из директории по умолчанию.
|
-n |
--no-php-ini |
Указывает на необходимость игнорировать конфигурационный файл php.ini, доступен, начиная с PHP 4.3.0. |
-d |
--define |
Эта опция позволяет устанавливать специальное значение для каждой из конфигурационных переменных, доступных в php.ini. Синтаксис выглядит следующим образом:
-d configuration_directive[=value] |
Примеры (переводы строк использованы, чтобы сделать текст более читаемым):
# Если опущено значение, то соответствующей опции будет
присвоено значение "1"
$ php -d max_execution_time
-r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(1) "1"
# Указание пустого значения инициализирует соответствующую
опцию значением ""
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" |
|
-a |
--interactive |
Запускает PHP в интерактивном режиме. |
-e |
--profile-info |
Генерирует дополнительную информацию для отладчика и профайлера. |
-z |
--zend-extension |
Подгружает дополнительный модуль Zend. В случае, если указано только имя файла, PHP ищет модуль в текущем пути к библиотекам по умолчанию (в Linux-системах он обычно указан в /etc/ld.so.conf). В случае, если указано имя файла и полный путь к нему, поиск в системных библиотеках не производится. Указание относительного пути к модулю приведет к поиску файла по указанному пути относительно текущей директории. |
-l |
--syntax-check |
Эта опция предоставляет удобный способ для проверки заданного PHP-кода на наличие синтаксических ошибок. В случае успешной проверки будет напечатана следующая фраза: "No syntax errors detected in <filename>",- и код возврата будет равен 0. А в случае неудачи - текст "Errors parsing <filename>" вместе с внутренними сообщениями разборщика и код возврата 255.
Проверка исходного кода при помощи данной опции не находит фатальных ошибок (например, таких как вызов неопределенных функций). Используйте опцию -f, если вы хотите проверить код на наличие фатальных ошибок.
Замечание: Эта опция не совместима с опцией -r.
|
-m |
--modules |
При использовании этой опции PHP напечатает список встроенных (а также подгруженных) модулей Zend и PHP.
$ php -m
[PHP Modules]
xml
tokenizer
standard
session
posix
pcre
overload
mysql
mbstring
ctype
[Zend Modules] |
|
-i |
--info |
Использование этой опции приводит к вызову функции phpinfo() и и выводу результирующей информации. В случае, если PHP работает некорректно, будет весьма логично выполнить php -i и посмотреть, выводятся ли сообщения об ошибке до информационных таблиц или даже вместо них. Учтите, что в случае использования CGI-модуля весь вывод будет в формате HTML и, как следствие, может выглядеть нечитабельно. |
-r |
--run |
Эта опция позволяет выполнять 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"]=>
[...] |
Если вы используете оболочку, отличную от sh/bash, у вас могут возникнуть другие вопросы. В таком случае создайте рапорт о возникшей проблеме на сайте http://bugs.php.net/ или напишите письмо по адресу phpdoc@lists.php.net. Вы вполне можете столкнуться с проблемами при попытке получить доступ к переменным оболочки или при работе с экранирующими обратными слешами. Мы вас предупредили.
Замечание: Ключ -r доступен в CLI SAPI и не доступен в CGI SAPI.
|
-h |
--help |
При помощи этой опции вы можете получить информацию о действующем списке опций командной строки и их краткое описание. |
-? |
--usage |
Алиас для --help. |
Исполняемый PHP-файл может использоваться для запуска PHP-скриптов независимо от веб-сервера. В случае, если вы работаете в Unix-подобной системе, вам необходимо добавить ко всем скриптам специальную первую строку и сделать их исполняемыми, чтобы указать, какая из программ должна обрабатывать эти скрипты. На Windows-платформах вы можете назначить обработчик php.exe для файлов с расширениями .php либо создать пакетный (.bat) файл для запуска скриптов посредством PHP. Строка, добавляемая вначале скрипта для Unix-систем, не влияет на их работу в ОС Windows, таким образом вы можете создавать кроссплатформенные скрипты. Ниже приведен простой пример скрипта, выполняемого из командной строки:
Скрипт, предназначенный для запуска из командной строки (script.php)
#!/usr/bin/php
<?php
if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>
Это консольный PHP-скрипт, принимающий один аргумент.
Использование:
<?php echo $argv[0]; ?> <option>
<option> Любое слово, которое вы хотели бы
напечатать. Опции --help, -help, -h,
или -? покажут текущую справочную информацию.
<?php
} else {
echo $argv[1];
}
?> |
В приведенном примере мы используем специальную первую строку для указания на то, что этот скрипт необходимо запускать при помощи PHP. Поскольку мы работаем с CLI-версией, то HTTP-заголовки выводиться не будут. При написании консольных приложений на PHP вам доступны две переменные: $argc и $argv. Первая - количество переданных аргументов плюс один (имя выполняемого скрипта). Вторая - массив переданных аргументов, начиная с имени скрипта с нулевым индексом ($argv[0]).
Также в приведенном примере мы проверяем количество переданных аргументов. В случае, если их более или менее одного, а также в случае, если переданный аргумент был --help, -help, -h или -?, мы выводим справочное сообщение, подставляя имя выполняемого скрипта динамически. В обратном случае мы просто печатаем полученный аргумент.
Если вы хотите выполнить приведенный пример в Unix-системе, вам необходимо сделать его исполняемым и просто выполнить из консоли script.php echothis или script.php -h. В Windows-системе вы можете создать для этого пакетный файл:
Пакетный файл для запуска PHP-скрипта из командной строки (script.bat)
@c:\php\cli\php.exe script.php %1 %2 %3 %4 |
|
Предполагая, что скрипт называется script.php и полный путь к CLI php.exe совпадает с c:\php\cli\php.exe, приведенный пакетный файл запустит скрипт с переданными вами параметрами: script.bat echothis либо script.bat -h.
Вы также можете ознакомится с расширением Readline, которое может быть использовано для усовершенствования консольного PHP-скрипта.
Разумеется, это не полный перечень кодов ответа HTTP, но приведенного списка основных кодов возврата вполне достаточно.
|