7

WindowsXPでコマンドラインからPHPを実行しようとしています。

PHPスクリプトにパラメーターを提供できないという事実を除いて、これは機能します。

私のテストケース:

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

私はこれを次のように呼びたいです:

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

しかし、パラメーターを受け入れるスクリプトを取得することはありません。

上記のスクリプトから得られる結果:

PHPの注意:未定義の変数:2行目のC:\test.phpのパラメーター

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

PHP5.2.6を使用してこれを試しています。これはPHP5のバグですか?

パラメータの受け渡しは、オンラインヘルプで処理されます。

注:スクリプトに引数を渡す必要がある場合は、-fスイッチを使用するときに最初の引数として--を渡す必要があります。

これはPHP4では機能しているように見えましたが、PHP5では機能していませんでした。

PHP 4では、コマンドラインを変更せずにサーバーで実行できるのと同じスクリプトを使用できました。これは、ローカルデバッグ、たとえば、出力をファイルに保存して調査する場合に便利です。

4

11 に答える 11

7

paramが値に設定されることを期待しているのはなぜですか?

$argv配列から、希望する方法でコマンド ラインを解析する責任があります。

于 2008-09-15T18:06:14.490 に答える
4

getopt()関数を使用できます。

ブログ投稿のPHP CLI スクリプト と コマンド ライン引数 を確認してください。

于 2011-05-12T12:39:29.813 に答える
3

GET 変数と同様にパラメーターを渡したい場合は、parse_str()関数を使用できます。これに似たもの:

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

<myValue> の値を持つ変数$testを生成します。

于 2011-05-27T19:37:34.740 に答える
3

パラメーターの受け渡しは、オンライン ヘルプで処理されます。 注: スクリプトに引数を渡す必要がある場合は、-f スイッチを使用するときの最初の引数として -- を渡す必要があります。これは PHP 4 では動作しているように見えましたが、PHP 5 では動作しませんでした。

しかし、PHP はまだこれらの引数を解析しません。$argv配列でスクリプトに渡すだけです。

--の唯一の理由は、どの引数が PHP 実行可能ファイル用で、どの引数がスクリプト用であるかを PHP が認識できるようにするためです。

これにより、次のようなことができます。

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

( の後の-f、-n、および -e オプション--はファイルmyScript.phpに渡されます。前のものは PHP 自体に渡されます)。

于 2008-09-15T18:19:18.327 に答える
1

PHPは、コマンドラインパラメータをパラメータ化しません。の2番目のエントリARGVが「param=test」である出力を参照してください。

ほとんどの場合、PEARパッケージConsole_CommandLine:"フル機能のコマンドラインオプションと引数パーサー"を使用することをお勧めします。

または、マゾヒスティックにコードを追加して、ARGV自分でパラメータを設定することもできます。開始するための非常に単純なスニペットを次に示します(最初の部分が有効な変数名でない場合、または部分に1つ以上の'='がある場合、これは機能しませんARGV

foreach($argv as $v) {
    if(false !== strpos($v, '=')) {
        $parts = explode('=', $v);
        ${$parts[0]} = $parts[1];
    }
}
于 2008-09-15T18:13:16.390 に答える
0

最先端を行くのが好きなら、PHP 5.3にはgetOpt()コマンドがあり、この厄介なビジネスをすべて処理します。幾分。

于 2009-10-12T21:59:26.967 に答える
0

$ argvは、すべてのコマンドラインパラメータを含む配列です...その配列を解析し、自分で$paramを設定する必要があります。

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

$param = $tmp[1];            // $param = "test";
于 2008-09-15T18:10:51.030 に答える
0

次のようなものを使用できます

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

(パラメータの不足をどのように処理するかはあなた次第です。)

または、より複雑なシナリオが必要な場合は、Pearのようなコマンド ライン パーサー ライブラリを調べてください。

投稿された別のソリューションを使用${$parts[0]} = $parts[1];すると、コード内の任意の変数をオーバーライドできますが、これは実際には安全とは言えません

于 2008-09-15T20:36:22.927 に答える
0

次のようなことができます:

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

もちろん、必要に応じてさらに複雑にすることもできます。

于 2008-09-15T18:13:44.597 に答える
-1

$argv配列を使用できます。このような:

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

$ argv配列の最初のメンバー( $ argv [0])はスクリプト自体の名前であることに注意してください。したがって、アプリケーションのパラメーターを使用するには、からの$ argv[]のメンバーの使用を開始する必要があります。 '1'番目のインデックス。

アプリケーションを呼び出すときは、次の構文を使用します。

php myscript.php -- myValue

パラメータに名前を付ける必要はありません。ご覧のとおり、$ argv []でvar_dump()と呼んだもの、2番目のメンバー(最初のパラメーター)は文字列PARAM=TESTでした。右?したがって、パラメータに名前を付ける必要はありません。param値を入力するだけです。

于 2008-09-15T19:00:56.293 に答える