PHP - аргументы командной строки в Windows

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
7
0
25 564
11

Ответы 11

Почему вы ожидаете, что парам будет установлен в значение?

Вы несете ответственность за синтаксический анализ командной строки из массива $ 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 [], второй член (который является первым параметром) был строкой ПАРАМЕТР = ТЕСТ. Правильно? Таким образом, нет необходимости указывать имя для параметра. Просто введите значение парам.

print_r($argv) более полезен для поиска неисправностей в массиве, imho.

Chris K 03.04.2012 05:26

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

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).

Robert Penridge 02.01.2014 23:30

Если вы хотите передать параметры, аналогичные переменным 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'];
    }
?>

Другие вопросы по теме