PHP: file_get_contents 在 cron 作业期间失败,但仅在 1 个脚本中。有人能告诉我为什么吗?
PHP: file_get_contents fails during cron job, but only in 1 script. Can someone tell me why?
我查看了建议的答案,但找不到我要找的东西。
我有一个内部网页为高级管理人员提供统计数据。
为了减少服务器负载和网页加载时间,我有一个 cron 作业 (cron_pateintcensus.php),它在服务器上创建一个 XML 文件。
这个文件被两个脚本访问
ptc_xmlreader.php //提供网页
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');
任何人都可以解释一下吗?
谢谢
如您所见What is the 'working directory' when cron executes a job:
Add cd /home/xxxx/Documents/Scripts/ if you want your job to run in that directory. There's no reason why cron would change to that particular directory. Cron runs your commands in your home directory.
因为您没有提供完整路径,所以您 运行 它来自主目录(当您手动 运行 它时,您可能已经 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/');
我查看了建议的答案,但找不到我要找的东西。
我有一个内部网页为高级管理人员提供统计数据。
为了减少服务器负载和网页加载时间,我有一个 cron 作业 (cron_pateintcensus.php),它在服务器上创建一个 XML 文件。
这个文件被两个脚本访问
ptc_xmlreader.php //提供网页
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');
任何人都可以解释一下吗?
谢谢
如您所见What is the 'working directory' when cron executes a job:
Add cd /home/xxxx/Documents/Scripts/ if you want your job to run in that directory. There's no reason why cron would change to that particular directory. Cron runs your commands in your home directory.
因为您没有提供完整路径,所以您 运行 它来自主目录(当您手动 运行 它时,您可能已经 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/');