如果使用cronjob调用,PHP fopen不能读取文件


PHP fopen can not read file if called with cronjob

我有一个php脚本,发送电子邮件报告与附件的pdf文档。我用fopen。如果我手动调用php文件,它的工作没有任何问题,邮件将按预期发送。

但:如果同一个文件应该被cron作业调用,那么它根本不起作用。错误是:警告:fopen(filename.pdf):打开流失败:第29行/home/public_html/util.php中没有这样的文件或目录

有什么办法解决这个问题吗?

每个cron都在最小环境中运行,最小环境可以是不同的shell和不同的配置文件,而不是您的用户帐户。此外,脚本不是从包含目录本身启动的。

在大多数情况下,如果您像在命令行shell中执行脚本那样将目录更改为包含脚本的目录,则它可以工作。而不是

* * * * * /usr/bin/php /path/to/your/file.php

写这个:

* * * * * cd /path/to/your/ && /usr/bin/php ./file.php

如果这还不够,您可以通过写入

来加载默认用户shell和PATH变量。
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

在crontab的顶部(当然要有正确的设置,可能是/bin/bashecho $PATH的输出)。

Cron作业运行时没有任何环境,包括当前目录。这意味着您需要使用完整的路径来处理任何想要处理的文件。

如果您在crontab的顶部添加了一个有效的电子邮件地址:

MAILTO=your-email@example.com

您将获得cron作业发送到您的电子邮件的任何输出。这包括错误消息,这对调试很有用。