php脚本在手动调用时完全可用,但不会从cron作业运行

时间:2015-08-03 12:23:57

标签: php mysql cron

我有一个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作业运行,但没有与解压缩本地zip文件有关。

更新

我已设法记录来自cronjob的错误输出,并报告此:

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

我不明白这一点,因为当我从浏览器运行代码时,所有代码都运行没有问题?

3 个答案:

答案 0 :(得分:1)

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

如果是,请尝试使用绝对的或在运行PHP之前将chdirs编写到PHP脚本的目录中。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

经过多次测试和调查后,最终成功了解了这一点!

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

更改我的cronjob调用脚本:

0 * * * * /usr/bin/php

0 * * * * /usr/bin/php5

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