使用cron作业执行PHP脚本

时间:2014-09-29 20:28:36

标签: php curl cron

我有一个名为cronStats.php的脚本,它从Apple的自动提取工具(应用程序下载数据,区域等)中提取数据,并填充数据库以供日后访问。

在浏览器中执行脚本时,一切正常。但是当使用预定的cron作业来执行脚本时会出现错误。

以下是相关代码:

function pullITCData($username,$password,$VND,$date) {

$fields_string = "USERNAME=" . urlencode($username);
$fields_string .= "&PASSWORD=" . urlencode($password);
$fields_string .= "&VNDNUMBER=" . $VND;
$fields_string .= "&TYPEOFREPORT=Sales";
$fields_string .= "&DATETYPE=Daily";
$fields_string .= "&REPORTTYPE=Summary";
$fields_string .= "&REPORTDATE=$date";  

$fn = "dailyStat_" . $date . "_" . $VND;
$filename = $fn . ".gz";

//$abFN = __DIR__ . "/" . $fn;
//$abFilename = __DIR__ . "/" . $filename;

$abFN = $fn;
$abFilename = $filename;

$ch = curl_init();
echo("<br>abFN url is $abFN");
echo("<br>abFilename url is $abFilename");  
$fp = fopen($abFilename, "w+");

//set the url, number of POST vars, POST data
curl_setopt($ch, CURLOPT_URL, 'https://reportingitc.apple.com/autoingestion.tft');
curl_setopt($ch, CURLOPT_POST, 7);
curl_setopt($ch, CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch, CURLOPT_FILE, $fp);

//execute post
$contents = curl_exec ($ch);
$fileCreated = false;

if ($contents === false) {
    echo("<br> no contents"); 
} else {
    echo("<br>contents found");
}


fclose($fp);
curl_close($ch);

//delete the opened file
if ($fileCreated == true){
    unlink("$abFN");
}

}

为简洁起见,我删除了一些代码。基本上,我将一串变量传递给Apple的摄取工具,然后返回一个.txt.gz文件(然后打开并解析,此处未显示)。

当浏览器执行时,我得到“找到内容”语句,但是通过Cron Job,“No Contents”语句意味着CURL_EXEC由于某种原因失败。

我的想法是无法创建.GZ文件,因为Cron Job正在从另一个目录(?)执行。我尝试设置一个绝对URL来写.txt.gz,但这也失败了:

[function.fopen]: failed to open stream: HTTP wrapper does not support writeable connections in

我不知道如何继续。有什么想法吗?

编辑: 感谢您的反馈,非常感谢。 基于BojanT的cron命令:

/web/cgi-bin/php5 cd "$HOME/html/path/to/php/cron/ && php cronStats.php > cron.log 2>&1

我收到以下错误:

/bin/sh: -c: line 0: unexpected EOF while looking for matching `"'
/bin/sh: -c: line 1: syntax error: unexpected end of file

编辑2 - 解决方法: 解决在类似情况下为任何人工作的方法。它不优雅/高效,并没有真正解决问题,而是为了它的价值:在另一个文件上设置一个cron作业:例如runCron.php:

 <?php

executeScript();

function executeScript() {
file_get_contents("http://website.com/path/to/php/cron/cronStats.php");
informOfExecution();
}

然后在绝对URL处执行实际文件。 informOfExecution()方法向我发送电子邮件通知更新。 cron直接调用文件会很好,但完成比完美更好。谢谢大家。

1 个答案:

答案 0 :(得分:2)

使用&#39; cd&#39;更改到您文件的目录然后运行您的文件。 例如:

* * * * * cd /f1/f2/f3/f4/ && php thing.php >> /home/output/outputs.txt