Выполнение PHP-файлов
В CLI SAPI есть три различных способа запуска PHP-кода:
-
Указание конкретного файла для запуска.
Оба способа (с указанием опции -f или без) запустят
файл my_script.php. Нет ограничений, какой
файл запускать; в частности, файлы не обязаны иметь
расширение .php
.
-
Передать PHP-код напрямую в командной строке.
Необходимо быть особо осторожным при использовании этого способа,
т.к. может произойти подстановка переменных оболочки при использовании
двойных кавычек.
Замечание:
Внимательно прочтите пример: в нем нет открывающих и закрывающих тегов!
Опция -r просто в них не нуждается, и их использование
приведёт к ошибке разбора.
-
Передать запускаемый PHP-код через стандартный поток ввода
(stdin
).
Это даёт мощную возможность создавать PHP-код и
передавать его запускаемому файлу, как показано в этом
(вымышленном) примере:
Вы не можете комбинировать любой из этих трёх способов запуска кода.
Как и любое другое консольное приложение, бинарный файл PHP
принимает аргументы, но PHP-скрипт также может получать
аргументы. PHP не ограничивает количество аргументов,
передаваемых в скрипт (оболочка консоли устанавливает
некоторый порог количества символов, которые могут быть переданы;
обычно этого лимита хватает). Переданные аргументы доступны
в глобальном массиве $argv. Первый индекс
(ноль) всегда содержит имя вызываемого скрипта из командной
строки. Учтите, что если код вызывается на лету из командной
строки с помощью опции -r, значением
$argv[0] будет "Стандартный поток"
("Standard input code"); до PHP 7.2.0 это был дефис ("-"
). То же самое верно и для кода,
переданного через конвейер из STDIN
.
Вторая зарегистрированная глобальная переменная — это
$argc, содержащая количество элементов
в массиве $argv
(а не количество аргументов,
переданных скрипту).
Если передаваемые аргументы не начинаются с символа
-
, то особых проблем быть не должно.
Передаваемый в скрипт аргумент, который начинается с -
создаст проблемы, т.к. PHP решит, что он сам должен его
обработать. Для предотвращения подобного поведения
используйте разделитель списка аргументов --
.
После того, как этот разделитель будет проанализирован PHP, все последующие
аргументы будут переданы в скрипт нетронутыми.
Однако, в Unix-системах есть ещё один способ использования
PHP для консольных скриптов. Можно написать скрипт,
первая строка которого будет начинаться с
#!/usr/bin/php
(или же другой
корректный путь к бинарному файлу PHP CLI).
После этой строки можно поместить обычный PHP-код, заключённый
в открывающие и закрывающие теги PHP. Как только будут установлены
корректные атрибуты запуска на файл (например,
chmod +x test), скрипт может быть
запущен как обычный консольный или perl-скрипт:
Пример #1 Запуск PHP-скрипта как консольного
#!/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-файл может использоваться для запуска PHP-скриптов
независимо от веб-сервера. В случае работы в Unix-подобной системе,
необходимо добавить в первую строку файла #!
(называемый также "shebang")
чтобы указать, какая из программ должна запускать скрипт.
На Windows-платформах можно назначить обработчик php.exe для файлов
с расширениями .php
или создать пакетный
(.bat) файл для запуска скриптов посредством PHP.
Строка, добавляемая в начале скрипта для Unix-систем,
не влияет на их работу в ОС Windows, таким образом можно
создавать кроссплатформенные скрипты. Ниже приведён простой
пример скрипта, выполняемого из командной строки:
Пример #2 Скрипт, предназначенный для запуска из командной строки (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];
}
?>
В приведённом выше скрипте в первой строке содержится 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 под актуальной учётной записью пользователя.
При работе в сетевой службе некоторые операции не будут выполнены, поскольку
"сопоставление имён учётных записей и идентификаторов безопасности не выполнено".