我创建了一个 crontab 规则:
* * * * * php /my/directory/file.php
我想从这个 crontab 传递一个要在 file.php 中使用的变量。
最好的方法是什么?
请记住,从 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"
)。
当您从命令行执行 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
)
我可以添加$argv
您可能想要使用的更复杂的命令行参数处理的答案getopt()
:http ://www.php.net/manual/en/function.getopt.php
以上两种方法都不适合我。我在主机的共享服务器上运行 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
希望对某人有所帮助。