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


76

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

php myfile.php?type=daily

但返回此错误:

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

我能做什么?

Answers:


131

?type=daily参数(在结束了$_GET阵列)仅适用于网络访问的页面。

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

如果该页面也用作网页,则可以考虑两个选项。使用shell脚本和wget访问它,然后从cron调用它:

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

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

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

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


2
推荐的方法是使用getopt()
ViliusL '18

define('STDIN')有什么作用?
CodeForGood

64

只需将其作为常规参数传递,然后使用$argv数组在PHP中访问即可。

php myfile.php daily

并在myfile.php中

$type = $argv[1];

3
使用:if(isset($ argv [1])){echo。$ argv [1]; }其他{die('no!'); }
demenvil '16

17

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

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

尽管覆盖global $_GET-array很麻烦,但是它会快速转换所有脚本以接受CLI参数。

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


完美的答案!谢谢!
Reado

8

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

PHP abc.php --name = xyz

abc.php

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

6

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

php myfile.php type=daily

然后你可以像这样盖住他们

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

3
这真的不是那么方便,它没有分离出键和值,它只是传递值“ type = daily”
spybart 16-02-26

5

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


1
尽管这可能会回答问题,但请考虑添加有关此解决方案如何解决问题的详细信息。请参考stackoverflow.com/help/how-to-answer
J. Chomel

如果添加var_dump($ b),则将此代码保存在文件myfile.php中,并以'php myfile.php type = daily'运行。在?>标记之前,您会看到数组$ b每天包含type =>。
easyaspi 2016年

4

您可以使用下一个代码来处理命令行和Webbrowser。将此代码放在您的php代码上方。它为每个命令行参数创建一个$ _GET变量。

在您的代码中,您只需要检查$ _GET变量即可,而不必担心从Web浏览器或命令行调用脚本。

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

您可以使用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')


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个参数


2

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

php test.php one two three

并在test.php内部:

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

1

有4种主要选择,两者都有其独特之处,我认为方法4有许多优点。


./script是一个shell脚本,#!/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,因为:

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

Only️只有26个params作为字母。


方法3: Bash全局变量

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"

使用bash echo输入字符串:

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

提要文件内容:

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

输入一个值数组:

./script <<< '["array entry","lol"]'
// var_dump( json_decode(trim(stream_get_contents(STDIN))) );

从文件中输入json:

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

通过读取STDIN,它可能与fread()或fgets()类似。


Bash脚本指南


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;

也可以直接使用

$$ key = $ val

这样使用:

myFile.php / key = val

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.