恐怕将您想要调用的函数的名称传递给 PHP 脚本不会自动运行该脚本中的函数。您的脚本文件将需要逻辑来响应传递给它的任何命令行参数,以便正确执行。
比方说file1.php
其中定义了几个函数。只是一系列函数定义 - 函数之外没有代码。如果您在命令行上运行该文件($ php file1.php
),将会发生的是 PHP 将加载该文件,解析您的函数,但是由于文件中没有任何内容calls任何这些函数,脚本都将到达末尾,执行将完成,并且实际上不会发生任何事情。
因此,为了执行其中一个函数,脚本需要检查提供的任何命令行参数,然后做出适当的反应。
在 PHP 中,$argv
变量是一个数组,其中首先包含所运行的文件的名称,然后按顺序包含任何命令行参数。除非用引号括起来或正确转义,否则空格将用作命令行参数的分隔符。如果该命令是通过命令行运行的,则您可以在根范围*中使用该变量。
这是 PHP 的描述$argv
多变的:
包含从命令行运行时传递给脚本的所有参数的数组。
注意:第一个参数 $argv[0] 始终是用于运行脚本的名称。
如果你跑php file1.php send mail --dry-run
,那么$argv
变量将是(此处以 JSON 格式显示):["file1.php", "send", "mail", "--dry-run"]
.
你可以用它做的就是放在你的末尾file1.php
查看该文件的代码$argv
变量并采取适当的行动。在您的问题中概述的具体情况下,请尝试在文件末尾添加类似的内容:
//If we have a command line argument
if (!empty($argv[1])) {
switch ($argv[1]) {
case "mail1":
mail1(); //Call our mail() function
echo "\n\nCalled function mail1()\n\n"; //Print what we did to the console
break;
}
}
现在当你开心的时候php file1.php mail1
,这最终就是你的 CRON 工作正在做的事情,第一个参数 ($argv[1]
)是“mail1”,所以mail1
switch 语句中的 case 被执行,它调用你的mail1
函数并向控制台写入一条有用的注释,以便您知道它执行了您所要求的操作。
有用的链接:
- http://php.net/manual/en/reserved.variables.argv.php http://php.net/manual/en/reserved.variables.argv.php
- http://php.net/manual/en/features.commandline.php http://php.net/manual/en/features.commandline.php
希望这可以帮助!
* 通过根范围,我的意思是它不是全局的,因此您无法在函数或类内部访问它,除非您将其传递给它们,但在它们之外您可以访问它。在上面的代码示例中,由于该代码位于函数或类之外,因此它可以访问$argv
.