2008-09-15 9 views
7

Я пытаюсь запустить PHP из командной строки под Windows XP.PHP - аргументы командной строки в Windows

Это работает, за исключением того факта, что я не могу предоставить параметры для своего PHP-скрипта.

Мой тест:

echo "param = ".$param."\n"; 
var_dump($argv); 

Я хочу назвать это как:

php.exe -f test.php -- param=test

Но я никогда не получить сценарий, чтобы принять мой параметр.

В результате я получаю из приведенного выше сценария

`PHP Примечания: Undefined переменным: пары в C: \ test.php в строке 2

param = '' 
array(2) { 
    [0]=> string(8) "test.php" 
    [1]=> string(10) "param=test" 
} 

Я пытаюсь это с помощью PHP 5.2.6 , Это ошибка в PHP5?

Вынесение параметр обрабатывается в 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. Это, казалось, работать под PHP4, но не под PHP5. В PHP4 я мог бы использовать тот же скрипт, который мог бы работать на сервере без изменения в командной строке. Это удобно для локальной отладки, например, для сохранения вывода в файле, который нужно изучить.

ответ

7

Почему у вас есть ожидание того, что параметр будет установлен в значение? Вы отвечаете за синтаксический анализ командной строки по вашему желанию из массива $ argv.

0

$ argv - массив, содержащий все параметры вашей командной строки ... Вам нужно проанализировать этот массив и установить $ param самостоятельно.

$tmp = $argv[1];    // $tmp="param=test" 
$tmp = explode("=", $tmp); // $tmp=Array(0 => param, 1 => test) 

$param = $tmp[1];   // $param = "test"; 
1

PHP не параметризует параметры вашей командной строки для вас. См. Вывод, где ваша вторая запись в ARGV - «param = test».

Что вы, скорее всего, хотите, это использовать пакет PEAR http://pear.php.net/package/Console_CommandLine: «Полнофункциональные параметры командной строки и парсер аргументов».

Или вы можете быть мазохистом и добавить код, чтобы пройти через ваш ARGV и сами установить параметры. Вот очень упрощенно фрагмент кода, чтобы вы начали (это не будет работать, если первая часть не является допустимым именем переменной или есть более чем 1 «=» в ARGV части:

foreach($argv as $v) { 
    if(false !== strpos($v, '=')) { 
     $parts = explode('=', $v); 
     ${$parts[0]} = $parts[1]; 
    } 
} 
0

Вы можете сделать что-то вроде:

if($argc > 1){ 
    if($argv[1] == 'param=test'){ 
     $param = 'test'; 
    } 
} 

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

3
.

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

Но PHP еще не анализирует эти аргументы. Он просто передает их скрипту в массив $ argv.

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

Это позволяет делать такие вещи, как это:

php -e -n -f myScript.php -- -f -n -e 

(The -f, -n, & -e после - передаются myScript.php Те, прежде чем передаются в PHP. сам).

+0

это работает для меня, спасибо ! – montrealist 2011-12-25 00:39:10

-1

вы можете использовать массив $ argv. как это:

<?php 
echo $argv[1]; 
?> 

помнить, что первый элемент массива $ ARGV (который составляет $ ARGV [0]) является имя самого скрипта, поэтому для того, чтобы использовать параметры приложения, вы должны начните использовать члены $ argv [] из «1-го индекса». при вызове приложения, используйте следующий синтаксис:

php myscript.php -- myValue 

нет никакой необходимости ставить имя параметра. как вы видели, то, что вы назвали var_dump() на $ argv [], вторым элементом (который является первым параметром) является строка PARAM = TEST. правильно? поэтому нет необходимости указывать имя для параметра. просто введите значение параметра.

+0

`print_r ($ argv)` более полезен для устранения неполадок массива imho. – 2012-04-03 01:26:50

0

Вы можете использовать что-то вроде

if (isset($argv[1]) { 
$arg1 = $argv[1];    
$arg1 = explode("=", $arg1); 
$param = $arg1[1];    
} 

(как обрабатывать отсутствие параметра/s до вас) или если вам нужен более сложный сценарий, заглянуть в библиотеку командной строки синтаксического анализа, такие как один от Pear.

, используя ${$parts[0]} = $parts[1];, размещенное в другом решении, позволяет вам переопределить любую переменную в коде, которую действительно не звучит безопасно.

0

Если вам нравится жить на переднем крае, PHP 5.3 имеет команду getOpt(), которая позаботится обо всем этом беспорядочном бизнесе для вас. В некотором роде.

3

Если вы хотите, чтобы передать Params аналогичные GET ВАР, то вы можете использовать функцию parse_str(). Нечто похожее на это:

<?php 
parse_str($argv[1]); 
?> 

Производит переменную $ test со значением myValue.

Надеюсь, это поможет!

0

командной строки Пример:

PHP myserver.php хост = 192.168.1.4 порт = 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']; 
} 
?>