我有一个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”
我不明白这一点,因为当我从浏览器运行代码时,所有代码都运行没有问题?
答案 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现在正确解压缩了我的文件!