PHP - аргументы командной строки в Windows - PullRequest
7 голосов
/ 15 сентября 2008

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

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

Мой тестовый пример:

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

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

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

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

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

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

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

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

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

Ответы [ 11 ]

7 голосов
/ 15 сентября 2008

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

3 голосов
/ 27 мая 2011

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

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

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

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

3 голосов
/ 12 мая 2011

Вы можете использовать getopt ();

Проверить это ::

http://sharingphp.blogspot.com/2011/04/php-cli-script-and-command-line.html

3 голосов
/ 15 сентября 2008

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

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

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

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

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

(-f, -n, & -e после - - передаются в myScript.php. Предыдущие передаются в сам PHP).

1 голос
/ 15 сентября 2008

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

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

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

foreach($argv as $v) {
    if(false !== strpos($v, '=')) {
        $parts = explode('=', $v);
        ${$parts[0]} = $parts[1];
    }
}
0 голосов
/ 09 октября 2014

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

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'];
}
?>
0 голосов
/ 13 октября 2009

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

0 голосов
/ 16 сентября 2008

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

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

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

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

0 голосов
/ 15 сентября 2008

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

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

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

php myscript.php -- myValue

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

0 голосов
/ 15 сентября 2008

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

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

Конечно, вы можете сделать намного сложнее, чем нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...