将变量传递给从命令行运行的php脚本

时间:2011-07-26 07:33:06

标签: php command-line command-line-arguments

我有一个需要从命令行运行的PHP文件(通过crontab)。我需要将type=daily传递给文件,但我不知道如何。我试过了:

php myfile.php?type=daily

但是返回了这个错误:

  

无法打开输入文件:myfile.php?type = daily

我该怎么办?

13 个答案:

答案 0 :(得分:116)

?type=daily参数(最后在$_GET数组中)仅对Web访问的页面有效。

您需要像php myfile.php daily一样调用它,并从$argv数组中检索该参数($argv[1],因为$argv[0]将是myfile.php })。

如果该页面也用作网页,您可以考虑两个选项。要么使用shell脚本访问它,要么从cron调用它:

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

或者检查php文件是否从命令行调用:

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

(注意:您可能需要/想要检查$argv是否实际包含足够的变量等等)

答案 1 :(得分:54)

只需将其作为普通参数传递,然后使用$argv数组在PHP中访问它。

php myfile.php daily

和myfile.php

$type = $argv[1];

答案 2 :(得分:13)

这些行会将php myfile.php "type=daily&foo=bar"之类的CLI调用的参数转换为众所周知的$_GET - 数组:

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

虽然覆盖全局$_GET - 数组相当混乱,但它会快速转换所有脚本以接受CLI参数。

有关详细信息,请参阅http://php.net/manual/en/function.parse-str.php

答案 3 :(得分:6)

参数像其他应用程序一样按索引发送

php myfile.php type=daily

然后你可以像这样gat他们

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

答案 4 :(得分:5)

使用getopt()函数,我们还可以从命令行读取参数,只需使用php运行命令传递值即可

php abc.php --name = xyz

abc.php

$ val = getopt(null,[“ name:”]));
print_r($ val);
o / p:-
数组(   '名称'=>'xyz', )

答案 5 :(得分:4)

将此代码保存在文件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

答案 6 :(得分:3)

我强烈建议使用getopt。

http://php.net/manual/en/function.getopt.php

上的文档

如果您希望帮助打印出选项而不是查看https://github.com/c9s/GetOptionKit#general-command-interface

答案 7 :(得分:3)

您可以使用下一个代码来使用命令行和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;
    }

答案 8 :(得分:2)

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

不应使用此代码。首先调用的CLI如:/ usr / bin / php phpscript.php将有一个argv值,即脚本名称

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

这个将永远执行,因为将有1或2个args passe

答案 9 :(得分:2)

您可以use what sep16 on php.net recommends

<?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')

答案 10 :(得分:2)

只需将其作为参数传递如下:

php test.php one two three

和test.php内:

<?php
if(isset($argv))
{
    foreach ($argv as $arg) 
    {
        echo $arg;
        echo "\r\n";
    }
}
?>

答案 11 :(得分:1)

有4种主要选择,两者都有其独特之处,方法4 在我看来具有很多优势。


./scriptshell script,以#!/usr/bin/php开头


方法1: $argv

./script hello wo8844rld
// $argv[0] = "script", $argv[1] = "hello", $argv[2] = "wo8844rld"   

⚠️使用$ argv,参数顺序至关重要。


方法2: getopt()

./script -p7 -e3
// getopt("p::")["p"] = "7", getopt("e::")["e"] = "3"

很难与$argv结合使用,因为:

  

⚠️选项的解析将在找到的第一个非选项处结束,   随后的所有内容都将被丢弃。

⚠️仅26个参数作为字母。


方法3: Bash Global variable

P9="xptdr" ./script
// getenv("P9") = "xptdr"
// $_SERVER["P9"] = "xptdr"

这些变量可以由在同一shell中运行的其他程序使用。

它们在关闭外壳时被吹掉,但是在php程序终止时不会被吹掉。我们可以在~/.bashrc中将它们设置为永久!


方法4: STDIN管道和stream_get_contents()

一些管道示例:


./script <<< "hello wo8844rld"
// stream_get_contents(STDIN) = "hello wo8844rld"

echo "hello wo8844rld" | ./script
// explode(" ",stream_get_contents(STDIN)) ...

./script < ~/folder/Special_params.txt
// explode("\n",stream_get_contents(STDIN)) ...

echo params.json | ./script
// json_decode(stream_get_contents(STDIN)) ...

我们可以传递非常长的字符串,数组, json ,这是一个包含参数行的 config 文件,功能强大。

通过阅读STDIN,可能works similary with fread() or fgets()


Bash-Scripting Guide

答案 12 :(得分:0)

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;

也可以直接使用

  

$$键= $ VAL

像这样使用:

  

myFile.php / key = val