PHP:file_get_contents在 cron 作业期间失败,但仅在 1 个脚本中失败.谁能告诉我为什么


PHP: file_get_contents fails during cron job, but only in 1 script. Can someone tell me why?

我已经浏览了建议的答案,但找不到我要找的东西。

我有一个内部网页,向高级管理层提供统计数据。

为了减少服务器负载和网页加载时间,我有一个在服务器上创建 XML 文件的 cron 作业 (cron_pateintcensus.php)。

此文件由两个脚本访问

ptc_xmlreader.php//feed 网页

ptc_emailer.php//每天通过电子邮件发送一次报告

在我的测试服务器上一切正常,昨晚我将其推广到我的生产环境中。

当 cron 作业运行时,电子邮件没有发出,但当我进入浏览器并调用电子邮件程序脚本时,它确实发出了。

事情是这样的...

读取网页文件的脚本和写入文件的脚本在访问它时没有问题。

电子邮件脚本告诉我它找不到该文件...但我从有效的脚本中复制并粘贴了file_get_contents行。

两个 cron 作业在同一用户下运行,并且该用户对文件夹和文件具有权限。

我设法让它工作,但我试图弄清楚它发生的原因,并希望有人能提供一些启示。

这是在 PHP 5.4.36 中运行的 Turnkey Lamp Debian 服务器。

这是原始代码

$output = file_get_contents('outputfiles/test.xml');

这是我将其更改为的内容,以使其正常工作

$rp = realpath(__DIR__.'/outputfiles');
$dc = file_get_contents($rp.'/test.xml');

谁能说出一些启示?

谢谢

正如你所看到的 cron 执行作业时的"工作目录"是什么:

添加 cd/home/xxxx/Documents/Scripts/如果您希望您的作业在该目录中运行。cron 没有理由会更改为该特定目录。Cron 在您的主目录中运行您的命令。

由于您没有提供完整路径,因此您可以从主目录运行它(手动运行时您可能已经cd到另一个位置)。

这可能意味着两者之间的区别

/home/foo/www/outputfiles/

/home/foo/outputfiles/ (does not exist)

这意味着当您使用__DIR__.'/outputfiles'它工作正常时,__DIR__解析为文件所在的路径(而不是您从中运行命令的文件夹)。

解决方案很简单:

通过__DIR__dirname(__FILE__)提供完整路径,或使用 chdir() 方法更改工作目录:

chdir(__DIR__);
// or
chdir('/home/foo/www/');