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

hd.*_*hd. 71 php command-line command-line-arguments

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

php myfile.php?type=daily
Run Code Online (Sandbox Code Playgroud)

但是这个错误被返回了:

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

我能做什么?

PtP*_*uzu 123

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

你需要调用它php myfile.php daily并从$argv数组中检索该参数(这将是$argv[1],因为$argv[0]将是myfile.php).

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

#!/bin/sh
wget http://location.to/myfile.php?type=daily
Run Code Online (Sandbox Code Playgroud)

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

if (defined('STDIN')) {
  $type = $argv[1];
} else { 
  $type = $_GET['type'];
}
Run Code Online (Sandbox Code Playgroud)

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

  • 推荐的方法是使用 getopt() (2认同)
  • Defined('STDIN') 的作用是什么? (2认同)

Chr*_*Fin 59

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

php myfile.php daily
Run Code Online (Sandbox Code Playgroud)

在myfile.php中

$type = $argv[1];
Run Code Online (Sandbox Code Playgroud)

  • 使用:if(isset($ argv [1])){echo.$的argv [1]; } else {die('no!'); } (3认同)

fbo*_*oes 14

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

if (!empty($argv[1])) {
  parse_str($argv[1], $_GET);
}
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

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

php abc.php --name = xyz

abc.php

$ val = getopt(null,["name:"]);
的print_r($ VAL);
o/p: -
array('name'=>'xyz',)


Sub*_*ger 6

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

php myfile.php type=daily
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样给他们加油

<?php
if (count($argv) == 0) exit;
foreach ($argv as $arg)
    echo $arg;
?>
Run Code Online (Sandbox Code Playgroud)

  • 这不是那么方便,它不会分离出键和值,只是传递值"type = daily" (3认同)

小智 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;  
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

如果var_dump($b);?>标记之前添加,您将看到数组$b包含type => daily.