web-dev-qa-db-ja.com

コマンドラインから実行しているPHPスクリプトに変数を渡します

コマンドラインから(crontab経由で)実行する必要があるPHPファイルがあります。 type=dailyをファイルに渡す必要がありますが、方法がわかりません。私は試した:

php myfile.php?type=daily

しかし、このエラーが返されました:

入力ファイルを開けませんでした:myfile.php?type = daily

私に何ができる?

69
hd.

?type=daily引数(最後は$_GET配列になります)は、Webアクセスページに対してのみ有効です。

php myfile.php dailyのように呼び出し、$argv配列から引数を取得する必要があります($argv[1]$argv[0]なので、myfile.phpになります)。

ページがWebページとしても使用されている場合は、2つの選択肢があります。シェルスクリプトとwgetでアクセスし、cronから呼び出します。

#!/bin/sh
wget http://location.to/myfile.php?type=daily

または、コマンドラインから呼び出されているかどうか、phpファイルをチェックインします。

if (defined('STDIN')) {
  $type = $argv[1];
} else { 
  $type = $_GET['type'];
}

(注:$argvに実際に十分な変数などが含まれているかどうかを確認する必要があります。

120
PtPazuzu

通常のパラメーターとして渡し、$argv配列を使用してPHPでアクセスします。

php myfile.php daily

およびmyfile.php内

$type = $argv[1];
58
ChrFin

これらの行は、php myfile.php "type=daily&foo=bar"などのCLI呼び出しの引数を、よく知られている$_GET- arrayに変換します。

if (!empty($argv[1])) {
  parse_str($argv[1], $_GET);
}

グローバル$_GET- arrayを上書きするのはかなり面倒ですが、すべてのスクリプトを迅速に変換してCLI引数を受け入れます。

詳細については http://php.net/manual/en/function.parse-str.php をご覧ください。

14
fboes

Getopt()関数を使用して、コマンドラインからパラメーターを読み取ることもできます。コマンドを実行するphpで値を渡すだけです

php abc.php --name = xyz

abc.php

$val = getopt(null, ["name:"]);
print_r($val); // output: ['name' => 'xyz'];
6
RSW

他のアプリケーションのようにインデックスで送信されるパラメーター

php myfile.php type=daily

そして、あなたはこのようにそれらをガットすることができます

<?php
if (count($argv) == 0) exit;
foreach ($argv as $arg)
    echo $arg;
?>
6
Subdigger

このコードをファイルmyfile.phpに保存し、php myfile.php type=dailyとして実行します

<?php
$a = $argv;
$b = array();
if (count($a) === 1) exit;
foreach ($a as $key => $arg) {
    if ($key > 0) {
        list($x,$y) = explode('=', $arg);
        $b["$x"] = $y;  
    }
}
?>

?>タグの前にvar_dump($b);を追加すると、$b配列にtype => dailyが含まれていることがわかります。

4
easyaspi

php.netのsep16が推奨するものを使用

<?php

parse_str(implode('&', array_slice($argv, 1)), $_GET);

?>

Cgi-phpを使用する場合とまったく同じように動作します。

$ php -f myfile.php type=daily a=1 b[]=2 b[]=3

$_GET['type']'daily'に、$_GET['a']'1'に、$_GET['b']array('2', '3')に設定します。

3
K3---rnc

次のコードを使用して、コマンドラインとwebbrowserを操作できます。このコードをphpコードの上に配置します。コマンドラインパラメーターごとに$ _GET変数を作成します。

コードでは、$ _ GET変数をチェックするだけでよく、スクリプトがwebbrowserまたはコマンドラインから呼び出されるかどうかは心配しません。

if(isset($argv))
    foreach ($argv as $arg) {
        $e=explode("=",$arg);
        if(count($e)==2)
            $_GET[$e[0]]=$e[1];
        else    
            $_GET[$e[0]]=0;
    }
3
hamboy75

Getoptの使用を強くお勧めします。

http://php.net/manual/en/function.getopt.php のドキュメント

https://github.com/c9s/GetOptionKit#general-command-interface をご覧になるよりも、オプションのヘルプを印刷したい場合

3
Francisco Luz
<?php
if (count($argv) == 0) exit;
foreach ($argv as $arg)
echo $arg;
?>

このコードは使用しないでください。まず、次のように呼び出されるCLI:/ usr/bin/php phpscript.phpには、スクリプトの名前であるargv値が1つあります

array(2) {
   [0]=>
   string(13) "phpscript.php"
}

1つまたは2つの引数が渡されるため、これは常に実行されます

2
Grzegorz

次のようにパラメータとして渡すだけです:

php test.php one two three

およびtest.php内:

<?php
if(isset($argv))
{
    foreach ($argv as $arg) 
    {
        echo $arg;
        echo "\r\n";
    }
}
?>
2
Sam Prasad
if (isset($argv) && is_array($argv)) {
    $param = array();
    for ($x=1; $x<sizeof($argv);$x++) {
        $pattern = '#\/(.+)=(.+)#i';
        if (preg_match($pattern, $argv[$x])) {
            $key =  preg_replace($pattern, '$1', $argv[$x]); 
            $val =  preg_replace($pattern, '$2', $argv[$x]);
            $_REQUEST[$key] = $val;
            $$key = $val;
        }    
    }
}

パラメーターを$ _REQUESTに入れます

$ _REQUEST [$ key] = $ val;

また、直接使用可能

$$ key = $ val

これを次のように使用します。

myFile.php/key = val

0
emmanuel