我的 php 文件 (file1.php) 中有一个函数。我正在尝试使用 cronjob 来调用此函数。我的 cron 作业命令是:
php /home/name/public_html/file1.php mail1
作为引用,函数代码如下,直接从文件调用时可以正常工作(即,问题似乎与函数本身无关。
function mail1($runTotal, $accountArray){
$to = $accountArray[0]['phoneNumber'] . '@vzwpix.com';
$subject = '';
$msg = "You have spent $" . $runTotal . " of $1,750 since the beginning of the month.;;
$msg = wordwrap($msg);
$headers = 'From: email@email.com';
if (mail($to, $subject, $msg, $headers)) {
echo $msg . " sent to " . $to;
}
}
我是否以错误的方式调用函数?
最佳答案
不敢说将您希望调用的函数的名称传递给 PHP 脚本将不会自动运行该脚本中的函数。您的脚本文件将需要逻辑来响应传递给它的任何命令行参数,以便正确执行。
假设 file1.php
中定义了几个函数。只是一系列函数定义——函数之外没有代码。如果您在命令行 ($ php file1.php
) 上运行该文件,将会发生的情况是 PHP 将加载该文件,解析您的函数,但是由于文件中没有任何内容调用 任何这些函数,脚本都会结束,执行会完成,实际上什么都不会发生。
因此,为了执行其中一个功能,脚本将需要检查提供的任何命令行参数,然后做出适当的 react 。
在 PHP 中,$argv
变量是一个数组,其中首先包含运行的文件的名称,然后按顺序包含任何命令行参数。除非用引号引起来或正确转义,否则空格用作命令行参数的分隔符。如果该命令是通过命令行运行的,则您可以在根范围内使用此变量*。
这是 PHP 对 $argv
变量的描述:
Contains an array of all the arguments passed to the script when running from the command line.
Note: The first argument $argv[0] is always the name that was used to run the script.
如果您运行 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 ",因此执行 switch 语句中的 mail1
案例,它调用您的 mail1
函数并向控制台写入一条有用的注释,以便您知道它完成了您的要求。
有用的链接:
- http://php.net/manual/en/reserved.variables.argv.php
- http://php.net/manual/en/features.commandline.php
希望这对您有所帮助!
* 我所说的根作用域是指它不是全局的,因此您不能在函数或类中访问它,除非您将它传递给它们,但在它们之外您可以访问它。在我上面的代码示例中,由于该代码在函数或类之外,因此它可以访问 $argv
。
关于php - 使用 cronjob 运行 php 文件中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39008763/