cron 作业中的参数

Arguments in cron jobs

我在共享服务器上。将参数传递给 crob 作业时,如下所示:

10  *   *   *   *   /usr/bin/php /home/website/cron/my_script.php country_id=10 

这与 php 脚本一起工作以获取 country_id 的值:

$country_id = $_GET['country_id'];

这不起作用,country_id 为空:

$country_id = $argv[1]

我的理解是第一个选项不应该起作用,第二个选项应该起作用,但恰恰相反。

谁能告诉我为什么?

(1) 对于您的情况, $argv[1] 是 country_id=10 ,而不是 10 。请确保您也有一个 semi-colon 来结束这一行。

(2) 假设您已经在使用 parse_str(解析 argv 数据的一种相当标准的做法),那么 $_GET["xxx"] 可以通过命令行从参数中获取值,这是正常的。在此处查看官方文档

https://www.php.net/manual/en/features.commandline.php

所以对于下面的代码 (test1.php):

<?php

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

echo $argv[1];
echo ",";
echo $_GET['a'];

?>

如果执行命令行:

php test1.php a=1

会显示

a=1,1

HTTP和CLI是完全不同的环境。

如果您想调整您的脚本,使其在任一环境中都无需更改即可运行,您确实可以从 country_id=10 获取数据,但您需要自己解析它,因为它不是 PHP 预计。您可以使用 parse_str(),但您需要确保您实际上遵循与实际 URL:

中相同的编码规则
if (isset($argv[1])) {
    parse_str($argv[1], $_GET);
}
var_dump($argv, $_GET);

如果您想编写一个表现得更传统的 command-line 脚本,您可以使用 getopt() 并像这样调用它:

/usr/bin/php /home/website/cron/my_script.php --country_id=10
/usr/bin/php /home/website/cron/my_script.php --country_id 10
$params = getopt('', ['country_id:']);
var_dump($params);