如何从shell_exec()发送电子邮件?

时间:2014-03-10 17:42:03

标签: php

使用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作业一样?

3 个答案:

答案 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解决方案可以解决问题。

快乐邮寄!