Я пытаюсь запустить PHP из командной строки под Windows XP.
Это работает, за исключением того факта, что я не могу предоставить параметры своему PHP-скрипту.
Мой тестовый пример:
echo "param = " . $param . "\n";
var_dump($argv);
Я хочу назвать это так:
php.exe -f test.php -- param=test
Но я никогда не заставляю скрипт принять мой параметр.
Результат, который я получил из приведенного выше сценария:
PHP Notice: Undefined variable: param in C:\test.php on line 2
param = ''
array(2) {
[0]=> string(8) "test.php"
[1]=> string(10) "param=test"
}
Я пытаюсь использовать PHP 5.2.6. Это ошибка PHP 5?
Передача параметров обрабатывается в онлайн помощь:
Note: If you need to pass arguments to your scripts you need to pass -- as the first argument when using the -f switch.
Казалось, что это работает под PHP 4, но не под PHP 5.
В PHP 4 я мог использовать тот же сценарий, который запускался на сервере без изменений в командной строке. Это удобно для локальной отладки, например, для сохранения вывода в файл для изучения.






Почему вы ожидаете, что парам будет установлен в значение?
Вы несете ответственность за синтаксический анализ командной строки из массива $ argv желаемым образом.
$ argv - это массив, содержащий все ваши параметры командной строки ... Вам нужно проанализировать этот массив и установить $ param самостоятельно.
$tmp = $argv[1]; // $tmp = "param=test"
$tmp = explode(" = ", $tmp); // $tmp=Array( 0 => param, 1 => test)
$param = $tmp[1]; // $param = "test";
PHP не параметризует параметры командной строки за вас. См. Вывод, где вторая запись в ARGV - «param = test».
Скорее всего, вы захотите использовать пакет PEAR Console_CommandLine: «Полнофункциональный синтаксический анализатор параметров командной строки и аргументов».
Или вы можете проявить мазохизм и добавить код, чтобы пройти через ARGV и самостоятельно установить параметры. Вот очень упрощенный фрагмент, который поможет вам начать работу (это не сработает, если первая часть не является допустимым именем переменной или в части ARGV больше 1 '=':
foreach($argv as $v) {
if (false !== strpos($v, '=')) {
$parts = explode('=', $v);
${$parts[0]} = $parts[1];
}
}
Вы можете сделать что-то вроде:
if ($argc > 1){
if ($argv[1] == 'param=test'){
$param = 'test';
}
}
Конечно, при необходимости вы можете усложнить задачу.
The parameter passing is handled in the online help Note: If you need to pass arguments to your scripts you need to pass -- as the first argument when using the -f switch. This seemed to be working under PHP 4, but not under PHP 5.
Но PHP по-прежнему не разбирает эти аргументы. Он просто передает их скрипту в массиве $ argv.
Единственная причина для - заключается в том, что PHP может определить, какие аргументы предназначены для исполняемого файла PHP, а какие - для вашего скрипта.
Это позволяет делать такие вещи:
php -e -n -f myScript.php -- -f -n -e
(Параметры -f, -n и -e после-- передаются в файл myScript.php. Предыдущие передаются самому PHP).
Вы можете использовать массив $ argv. Так:
<?php
echo $argv[1];
?>
Помните, что первый член массива $ argv (который является $ argv [0]) - это имя самого скрипта, поэтому для использования параметров для приложения вы должны начать использовать элементы $ argv [] из «1» -го индекса.
При вызове приложения используйте этот синтаксис:
php myscript.php -- myValue
Имя параметра указывать не нужно. Как вы видели, то, что вы назвали var_dump () в $ argv [], второй член (который является первым параметром) был строкой ПАРАМЕТР = ТЕСТ. Правильно? Таким образом, нет необходимости указывать имя для параметра. Просто введите значение парам.
Вы можете использовать что-то вроде
if (isset($argv[1]) {
$arg1 = $argv[1];
$arg1 = explode(" = ", $arg1);
$param = $arg1[1];
}
(Как справиться с отсутствием параметров - решать вам.)
Или, если вам нужен более сложный сценарий, поищите библиотеку синтаксического анализатора командной строки, например, из Груша.
Использование ${$parts[0]} = $parts[1];, размещенного в другом решении, позволяет вам переопределить любую переменную в вашем коде, которая не кажется безопасным.
Если вам нравится жить на передовой, в PHP 5.3 есть команда getOpt (), которая позаботится обо всем этом за вас. В некотором роде.
Вы можете использовать функцию getopt ().
Проверьте сообщение в блоге Сценарий PHP CLI и аргументы командной строки.
Согласно этому сайту: tuxradar.com/practicalphp/21/2/4getopt() не работает в Windows (которую использует OP).
Если вы хотите передать параметры, аналогичные переменным GET, вы можете использовать функцию parse_str (). Что-то похожее на это:
<?php
parse_str($argv[1]);
?>
Создает переменную $ test со значением <myValue>.
Пример командной строки:
php myserver.php host=192.168.1.4 port=9000
В файле myserver.php используйте следующие строки:
<?php
parse_str(implode('&', array_slice($argv, 1)), $_GET);
// Read arguments
if (array_key_exists('host', $_GET))
{
$host = $_GET['host'];
}
if (array_key_exists('port', $_GET))
{
$port = $_GET['port'];
}
?>
print_r($argv)более полезен для поиска неисправностей в массиве, imho.