我创建了一个crontab规则:
* * * * * php /my/directory/file.php
我想从此crontab传递一个要在file.php中使用的变量。
这样做的最佳方法是什么?
答案 0 :(得分: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"
)。
答案 1 :(得分:7)
从命令行执行PHP脚本时,您可以访问$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
)
答案 2 :(得分:1)
我可以添加$argv
个答案,对于更复杂的命令行参数处理,您可能希望使用getopt()
:http://www.php.net/manual/en/function.getopt.php
答案 3 :(得分:0)
上述两种方法都不适合我。我在我的主机托管服务器上运行了cron。使用类似cPanel的接口创建cron任务。命令行调用PHP传递脚本名称和几个参数。
这就是cron命令行的样子:
php7.2 /server/path/to/my/script/my-script.php "test.tst" "folder=0"
以上$argv
的答案都没有适用于我的案例。
在您获得CLI参数的访问权限之前,没有人告诉您必须将$argv
声明为全局。官方PHP手册中既没有提到这一点。
好吧,可能必须为运行服务器的脚本声明$argv
全局ony。也许在本地环境中,在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
希望能帮助某人。