2012-02-14 38 views
3

私はいくつかのオンラインデータを取得するスクリプトを書き留めようとしています。スクリプトは、cronジョブまたはphp cliおよび標準GET HTTP要求のいずれかで呼び出す必要があります。 PHPウェブサイト$_SERVER['argv']に記載の通り、私のニーズに合っているはずです:

スクリプトに渡される引数の配列。スクリプトを コマンドラインで実行すると、コマンドライン のパラメータにCスタイルでアクセスできます。 GETメソッドを使用して呼び出すと、 クエリ文字列が含まれます。

しかし、標準のHTTP GETリクエストでは動作しません。 $_SERVER['argv']が設定されていません。私は何が欠けているのですか?

<?php 
    // jobs/fetch.php 
    var_dump($_SERVER['argv']); 
?> 

CLI出力php jobs/fetch.php -a -bhello

array(3) { 
    [0]=> 
    string(14) "jobs/fetch.php" 
    [1]=> 
    string(2) "-a" 
    [2]=> 
    string(7) "-bhello" 
} 

GET出力jobs/fetch.php?a=&b=hello

お知らせ:未定義のインデックス:ジョブ/ fetch.phpにargvを。

答えて

14

、その後、マニュアルは非常によくこれを述べるませんでしたが、あなたはあなたがCLIモードで実行していないとき$_SERVER['argc']$_SERVER['argv']$argc、が登録されるようにする場合php.iniregister_argc_argvをphp.iniで有効にする必要があります(デフォルトでは[パフォーマンス上の理由から])。あなたはスクリプトが実行されている方法に応じargv、またはクエリ文字列引数を取得するために、次の手順を実行でき

if (php_sapi_name() == 'cli') { 
    $args = $_SERVER['argv']; 
} else { 
    parse_str($_SERVER['QUERY_STRING'], $args); 
} 

ここではphp.iniからのいくつかの詳細は以下のとおりです。

; This directive determines whether PHP registers $argv & $argc each time it 
; runs. $argv contains an array of all the arguments passed to PHP when a script 
; is invoked. $argc contains an integer representing the number of arguments 
; that were passed when the script was invoked. These arrays are extremely 
; useful when running scripts from the command line. When this directive is 
; enabled, registering these variables consumes CPU cycles and memory each time 
; a script is executed. For performance reasons, this feature should be disabled 
; on production servers. 
; Note: This directive is hardcoded to On for the CLI SAPI 
; Default Value: On 
; Development Value: Off 
; Production Value: Off 
; http://php.net/register-argc-argv 

も参照してくださいhttp://www.php.net/manual/en/reserved.variables.argv.phpparse_str()

3

あなたのスクリプトが呼び出された方法に応じ$_GETまたは$_SERVER['argv']を使用する必要があります。どちらもどちらにも使用されません。例えば

if(!empty($_SERVER['argv'][0]) { 
    $a = $_SERVER['argv'][1]; 
    $b = $_SERVER['argv'][2]; 
} else { 
    $a = $_GET['a']; 
    $b = $_GET['b']; 
}