Выполнение PHP-файлов

В CLI SAPI есть три различных способа запуска PHP-кода:

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

    $ php my_script.php
    
    $ php -f my_script.php
    

    Оба способа (с указыванием опции -f или без) запустят файл my_script.php. Нет ограничений, какой файл запускать, и PHP-скрипты не обязаны иметь расширение .php.

    Замечание:

    Если необходимо передать аргументы в скрипт, то при использовании опции -f первым аргументом должен быть -- .

  2. Передать PHP-код напрямую в командной строке.

    $ php -r 'print_r(get_defined_constants());'
    

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

    Замечание:

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

  3. Передать запускаемый PHP-код через стандартный поток ввода (stdin).

    Это дает мощную возможность создавать PHP-код и скармливать его запускаемому файлу, как показано в этом (вымышленном) примере:

    $ some_application | some_filter | php | sort -u > final_output.txt
    
Вы не можете комбинировать любой из этих трех способов запуска кода.

Как и любое другое консольное приложение, бинарный файл PHP принимает аргументы, но PHP-скрипт также может получать аргументы. PHP не ограничивает количество аргументов, передаваемых в скрипт (оболочка консоли устанавливает некоторый порог количества символов, которые могут быть переданы; обычно этого лимита хватает). Переданные аргументы доступны в глобальном массиве $argv. Первый индекс (ноль) всегда содержит имя вызываемого скрипта из командной строки. Учтите, что если код вызывается на лету из командной строки с помощью опции -r , значением $argv[0] будет просто дефис (-). То же самое верно и для кода, переданного через конвеер из STDIN.

Вторая зарегистрированная глобальная переменная - это $argc, содержащая количество элементов в массиве $argv ( (а не количество аргументов, переданных скрипту).

Если передаваемые аргументы не начинаются с символа -, то особых проблем быть не должно. Передаваемый в скрипт аргумент, который начинается с - создаст проблемы, так как PHP решит, что он сам должен его обработать. Для предотвращения подобного поведения используйте разделитель списка аргументов --. После того как этот разделитель будет прочитан PHP, все последующие аргументы будут переданы в скрипт нетронутыми.

# Эта команда не запустит данный код, но покажет информацию об использовании PHP
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] <file> [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-скрипта как консольного

#!/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 != || in_array($argv[1], array('--help''-help''-h''-?'))) {
?>

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

  Использование:
  <?php echo $argv[0]; ?> <option>

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

<?php
} else {
    echo 
$argv[1];
}
?>

Скрипт приведенный выше включается в себя специальную Unix строку, указывающую на его запуск с помощью 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.


Участник рейтинга Тэглайн 2010