8

我创建了一个 crontab 规则:

* * * * * php /my/directory/file.php

我想从这个 crontab 传递一个要在 file.php 中使用的变量。

最好的方法是什么?

4

4 回答 4

11

请记住,从 shell 运行 PHP 与在 Web 服务器环境中运行它是完全不同的。如果您以前没有做过命令行编程,您可能会遇到一些意外。

也就是说,将信息传递到命令中的常用方法是将其放在命令行上。如果你这样做:

 php /my/directory/file.php "some value" "some other value"

然后在您的脚本中,$argv[1]将设置为"some value"并将$argv[2]设置为"some other value". ($argv[0]将设置为"/my/directory/file.php")。

于 2012-04-22T00:49:28.097 回答
7

当您从命令行执行 PHP 脚本时,您可以访问变量 count$argc和数组中的实际值$argv。一个简单的例子。

考虑test.php

<?php
printf("%d arguments given:\n", $argc);
print_r($argv);

执行此使用php test.php a b c

4 arguments given:
Array
(
    [0] => test.php
    [1] => a
    [2] => b
    [3] => c
)
于 2012-04-22T00:49:32.557 回答
1

我可以添加$argv您可能想要使用的更复杂的命令行参数处理的答案getopt()http ://www.php.net/manual/en/function.getopt.php

于 2012-04-22T00:58:16.500 回答
0

以上两种方法都不适合我。我在主机的共享服务器上运行 cron。cron 任务是使用类似 cPanel 的界面创建的。命令行调用 PHP 并传递脚本名称和几个参数。

这就是 cron 命令行的外观:

php7.2 /server/path/to/my/script/my-script.php "test.tst" "folder=0"

上面的答案都不$argv适用于我的情况。

没有人告诉您必须$argv在访问 CLI 参数之前声明为全局的。这在官方 PHP 手册中都没有提到。

好吧,可能必须为$argv与服务器一起运行的脚本声明全局唯一。也许在本地环境中,在 CLI 中运行脚本$argv不需要被声明为全局的。当我测试它时,我在这里发布。

但就我而言,工作配置是:

global $argv;
echo "argv0: $argv[0]\n\r"; // echoes: argv0: /server/path/to/my/script/my-script.php
echo "argv1: $argv[1]\n\r"; // echoes: argv1: test.tst
echo "argv2: $argv[2]\n\r"; // echoes: argv2: folder=0

我用$_SERVER['argv']超全局数组得到了相同的结果。可以像这样使用它:

 $myargv = $_SERVER['argv'];
 echo $myargv[1]; // echoes: test.tst

希望对某人有所帮助。

于 2018-02-19T10:20:12.960 回答