PHP脚本在手动调用时完全工作,但不能从cron job运行


php script works fully when called manually, but won't run from cron job

我有一个PHP脚本,它基本上复制一个zip文件,解压缩,然后将生成的文本文件复制到MySQL数据库。

当我手动调用我的php页面时,这工作完美,但这需要每天完成,所以我想将其设置为cron作业。

我有一个cron工作,我已经通过调用一个非常简单的脚本验证了这一点,但是当试图运行我的整个页面时,它失败了。

我已经追踪到两个代码区域。首先:

date_default_timezone_set('Europe/London');

我知道我可以通过htaccess或php.ini文件设置这个,所以我不关心这个。

但是,阻止cron作业运行的第二个代码区域是:

$localzipfile = "myfolder/myzipfile.zip";
$localzipfilefullpath = "/homepages/20/dXXXXXXXXX/htdocs/sub/folder/" . $localzipfile . "";
$localpath = pathinfo(realpath($localzipfile), PATHINFO_DIRNAME);
$zip = new ZipArchive;
$res = $zip->open($localzipfilefullpath);
if ($res === TRUE) {
$zip->extractTo($localpath);
$zip->close();
}

同样,当我手动运行代码时,这一切都工作得很好,所以我知道一切都在适当的位置工作。所有路径都是正确的,并且zip文件按预期解压缩。

只有当我尝试将此作为cron作业运行时,它才会失败并且无法解压缩文件。

我看到过几个关于php文件手动运行但不作为cron作业运行的SO问题,但没有一个与解压缩本地zip文件有关。

更新:

我已经设法记录了cronjob的错误输出,它报告如下:

"无法实例化不存在的类:ziparchive"

我不明白这一点,虽然,所有的代码运行没有问题,当我从浏览器运行它?

您是否使用$localzipfile和$localpath的相对路径?

如果是,尝试使用绝对值,或者在运行PHP之前编写一个shell脚本,将其chdirs放入PHP脚本的目录。

文件的路径必须是绝对的,例如:

$localzipfile = "/home/myfolder/myzipfile.zip";
$localzipfilefullpath = "/var/www/html/homepages/20/dXXXXXXXXX/htdocs/sub/folder/" . $localzipfile;

你确定运行cron的用户有权限访问这两个目录吗?Cron可能在不同的用户下运行,该用户不能访问/myfolder或/html目录,因此请确保为用户提供适当的权限。你可以看到这两个答案Answer1 | Answer2我张贴了一段时间关于如何设置权限。

经过多次测试和调查,终于找到了这个问题的根源!

感谢所有提出建议的人,但似乎当我通过浏览器运行脚本时,它运行在PHP 5.4版本,但当cron作业运行时,它运行在4.9版本!

修改我的cronjob调用脚本:

0 * * * * /usr/bin/php

0 * * * * /usr/bin/php5

解决了压缩问题,cronjob现在可以正确解压缩我的文件了!

相关文章: