使用cron作业,正在执行的文件的输出通过电子邮件发送给我。我最近通过this answer发现可以使用shell_exec()
函数异步执行PHP文件。根据上面的回答,我一直在使用以下命令:
shell_exec('php /file/path.php parameter1 parameter2 > /dev/null 2>/dev/null &');
我认为对这个问题最感兴趣的是最后的东西:
> /dev/null 2>/dev/null &
有没有办法改变它以便通过电子邮件发送输出,就像使用cron作业一样?
答案 0 :(得分:2)
该行
> /dev/null 2>/dev/null &
基本上将输出发送到空文件。如果您取消该位,则输出将被发送到标准输出,如果您使用cron作业运行它,则应该通过电子邮件向您发送结果。
所以,
shell_exec('php /file/path.php parameter1 parameter2');
如果您没有使用cron作业运行它,则需要为脚本本身构建电子邮件功能。
答案 1 :(得分:2)
首先,shell_exec()
不是异步的。在shell_exec()
呼叫终止之前,将暂停执行PHP代码。
这:> /dev/null
告诉shell将stdout从正在执行的进程重定向到/dev/null
,这意味着它会消失。这个:2> /dev/null
做同样的事情,但是对于stderr而不是stdout。
如果删除shell_exec()
调用的这些部分,则调用将返回写入stdout的内容:
$result = shell_exec('php /file/path.php parameter1 parameter2');
mail('me@email.com', 'Shell output', $result);
shell_exec()
还有其他替代品可以更好地满足您的需求。例如,popen()and
proc_open()`允许对输入和输出进行更细粒度的控制。
此外,由于您正在执行PHP脚本,因此您可以简单地使用include()
或require()
,具体取决于脚本的编写方式。另一种选择是读取文件,然后使用eval()
执行PHP代码。
答案 2 :(得分:1)
使用:
| mail -s "Result of cron job" myemail@company.com
在你的命令结束时。此外,您可以将stderr和stdout传递给stdout 2> &1 | mail....
这应该可以解决问题。也许是因为你使用shell_exec(“...&”),你必须将整个php /file/... | mail -s "result" myemail@company.com
包装在子shell中。像:
shell_exec('(php /file/path.php parameter1 parameter2 2> &1 | mail -s "Result of cron job" myemail@company.com) &')
这是让输出发送消息的一种相当丑陋的方式,我建议支持重构shell_exec
的外部调用来读取stderr和stdout,制作消息并将其发送给自己。同时| mail
解决方案可以解决问题。
快乐邮寄!