我有一个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现在可以正确解压缩我的文件了!